From c29c19bb0a88f494e506db411179b617a2f90298 Mon Sep 17 00:00:00 2001 From: Pasukhin Dmitry Date: Tue, 18 Mar 2025 19:25:03 +0000 Subject: [PATCH] Coding - Migration of Inspector to own repository #438 New repository for Inspector: https://github.com/Open-Cascade-SAS/Inspector Documentation and all build process are fully migrated. "tools" folder keep to share information for some time. Keep building inspector as before to keep control of API changes via GitHub actions. --- .github/actions/build-tinspector/action.yml | 21 +- .github/actions/clang-format-check/action.yml | 2 +- CMakeLists.txt | 46 +- adm/TOOLS | 4 - adm/UDLIST | 20 - adm/cmake/occt_toolkit_prepare_tool.cmake | 13 - adm/cmake/vardescr.cmake | 7 - adm/scripts/cmake_custom.bat.template | 1 - adm/scripts/cmake_custom.sh.template | 1 - adm/scripts/cmake_gen.bat | 2 - adm/scripts/cmake_gen.sh | 2 - adm/templates/TInspectorEXE.vcxproj.user.in | 30 - adm/templates/inspector.bat | 17 - adm/templates/inspector.sh | 9 - dox/FILES_HTML.txt | 1 - dox/FILES_PDF.txt | 1 - dox/samples/novice_guide.md | 1 - .../draw_test_harness/draw_test_harness.md | 1 + dox/user_guides/inspector/images/3DView.png | Bin 7068 -> 0 bytes .../inspector/images/3DView_elements.svg | 224 ---- .../images/3DView_set_orientation.png | Bin 9474 -> 0 bytes .../inspector/images/TStandaloneEXE.png | Bin 35425 -> 0 bytes .../inspector/images/TStandaloneEXE_open.png | Bin 30523 -> 0 bytes .../inspector/images/VStudio_projects.png | Bin 17034 -> 0 bytes .../inspector/images/dfbrowser.png | Bin 39068 -> 0 bytes .../inspector/images/dfbrowser_elements.svg | 27 - .../dfbrowser_selection_in_tree_view.svg | 218 ---- .../display_additional_presentation.png | Bin 7589 -> 0 bytes .../images/display_main_presentation.png | Bin 7587 -> 0 bytes .../inspector/images/drawexe_tinspector.png | Bin 22859 -> 0 bytes .../inspector/images/dump_attribute.png | Bin 8186 -> 0 bytes .../images/messageview_dump_panel.png | Bin 33994 -> 0 bytes .../inspector/images/messageview_elements.svg | 21 - .../images/messageview_pop_up_menu.png | Bin 15022 -> 0 bytes .../messageview_property_panel_custom.png | Bin 25005 -> 0 bytes .../inspector/images/messageview_view.png | Bin 31358 -> 0 bytes .../inspector/images/preferences.png | Bin 6152 -> 0 bytes .../inspector/images/property_panel.png | Bin 155383 -> 0 bytes .../images/property_panel_custom_array.png | Bin 2776 -> 0 bytes .../property_panel_custom_item_selection.svg | 173 --- .../images/property_panel_custom_label.png | Bin 5789 -> 0 bytes .../property_panel_custom_named_data.png | Bin 4329 -> 0 bytes .../property_panel_custom_simple_type.png | Bin 1791 -> 0 bytes ...perty_panel_custom_tnaming_named_shape.png | Bin 10430 -> 0 bytes .../property_panel_custom_tnaming_naming.png | Bin 4645 -> 0 bytes ...perty_panel_custom_tnaming_used_shapes.png | Bin 6110 -> 0 bytes .../property_panel_custom_tree_node.png | Bin 4399 -> 0 bytes dox/user_guides/inspector/images/search.png | Bin 33998 -> 0 bytes .../inspector/images/shapeview.png | Bin 63536 -> 0 bytes .../inspector/images/shapeview_elements.svg | 16 - .../images/shapeview_property_panel.png | Bin 24606 -> 0 bytes .../images/shapeview_tree_columns.png | Bin 19597 -> 0 bytes .../inspector/images/tinspector_elements.svg | 19 - .../inspector/images/treeview_preferences.svg | 417 ------ .../inspector/images/vinspector.png | Bin 21381 -> 0 bytes .../inspector/images/vinspector_elements.svg | 19 - .../images/vinspector_light_setting.png | Bin 31964 -> 0 bytes .../images/vinspector_property_panel.png | Bin 36449 -> 0 bytes .../images/vinspector_tree_columns.png | Bin 17567 -> 0 bytes dox/user_guides/inspector/inspector.md | 635 ---------- dox/user_guides/user_guides.md | 1 - tools/CMakeLists.txt | 405 ------ tools/Convert/Convert_Tools.cxx | 294 ----- tools/Convert/Convert_Tools.hxx | 113 -- tools/Convert/Convert_TransientShape.hxx | 50 - tools/Convert/FILES | 3 - tools/DFBrowser/DFBrowser.qrc | 18 - .../DFBrowser_AttributePaneStack.cxx | 153 --- .../DFBrowser_AttributePaneStack.hxx | 94 -- .../DFBrowser/DFBrowser_AttributePaneType.hxx | 27 - tools/DFBrowser/DFBrowser_Communicator.cxx | 50 - tools/DFBrowser/DFBrowser_Communicator.hxx | 80 -- tools/DFBrowser/DFBrowser_DumpView.cxx | 98 -- tools/DFBrowser/DFBrowser_DumpView.hxx | 60 - .../DFBrowser/DFBrowser_HighlightDelegate.cxx | 39 - .../DFBrowser/DFBrowser_HighlightDelegate.hxx | 48 - tools/DFBrowser/DFBrowser_Item.cxx | 216 ---- tools/DFBrowser/DFBrowser_Item.hxx | 106 -- tools/DFBrowser/DFBrowser_ItemApplication.cxx | 69 - tools/DFBrowser/DFBrowser_ItemApplication.hxx | 81 -- tools/DFBrowser/DFBrowser_ItemBase.cxx | 162 --- tools/DFBrowser/DFBrowser_ItemBase.hxx | 101 -- tools/DFBrowser/DFBrowser_ItemDocument.cxx | 149 --- tools/DFBrowser/DFBrowser_ItemDocument.hxx | 96 -- tools/DFBrowser/DFBrowser_ItemRole.hxx | 32 - tools/DFBrowser/DFBrowser_Module.cxx | 254 ---- tools/DFBrowser/DFBrowser_Module.hxx | 161 --- tools/DFBrowser/DFBrowser_OpenApplication.cxx | 104 -- tools/DFBrowser/DFBrowser_OpenApplication.hxx | 42 - tools/DFBrowser/DFBrowser_PropertyPanel.cxx | 65 - tools/DFBrowser/DFBrowser_PropertyPanel.hxx | 62 - tools/DFBrowser/DFBrowser_SearchItemInfo.hxx | 62 - tools/DFBrowser/DFBrowser_SearchLine.cxx | 191 --- tools/DFBrowser/DFBrowser_SearchLine.hxx | 103 -- tools/DFBrowser/DFBrowser_SearchLineModel.cxx | 213 ---- tools/DFBrowser/DFBrowser_SearchLineModel.hxx | 129 -- tools/DFBrowser/DFBrowser_SearchView.cxx | 133 -- tools/DFBrowser/DFBrowser_SearchView.hxx | 88 -- tools/DFBrowser/DFBrowser_Tools.cxx | 105 -- tools/DFBrowser/DFBrowser_Tools.hxx | 59 - tools/DFBrowser/DFBrowser_TreeLevelLine.cxx | 263 ---- tools/DFBrowser/DFBrowser_TreeLevelLine.hxx | 133 -- .../DFBrowser_TreeLevelLineDelegate.cxx | 57 - .../DFBrowser_TreeLevelLineDelegate.hxx | 49 - .../DFBrowser_TreeLevelLineModel.cxx | 100 -- .../DFBrowser_TreeLevelLineModel.hxx | 100 -- tools/DFBrowser/DFBrowser_TreeLevelView.cxx | 167 --- tools/DFBrowser/DFBrowser_TreeLevelView.hxx | 90 -- .../DFBrowser_TreeLevelViewModel.cxx | 140 --- .../DFBrowser_TreeLevelViewModel.hxx | 113 -- tools/DFBrowser/DFBrowser_TreeModel.cxx | 300 ----- tools/DFBrowser/DFBrowser_TreeModel.hxx | 121 -- tools/DFBrowser/DFBrowser_Window.cxx | 1120 ----------------- tools/DFBrowser/DFBrowser_Window.hxx | 249 ---- tools/DFBrowser/FILES | 48 - tools/DFBrowser/icons/attribute.png | Bin 267 -> 0 bytes tools/DFBrowser/icons/attribute_40x40.png | Bin 410 -> 0 bytes tools/DFBrowser/icons/export_shape.png | Bin 276 -> 0 bytes tools/DFBrowser/icons/folder_export.png | Bin 1212 -> 0 bytes tools/DFBrowser/icons/item_type_folder.png | Bin 615 -> 0 bytes .../icons/item_type_folder_40x40.png | Bin 756 -> 0 bytes tools/DFBrowser/icons/level_change.png | Bin 232 -> 0 bytes tools/DFBrowser/icons/named_shape.png | Bin 317 -> 0 bytes tools/DFBrowser/icons/named_shape_40x40.png | Bin 504 -> 0 bytes tools/DFBrowser/icons/search.png | Bin 454 -> 0 bytes tools/DFBrowser/icons/search_cancel.png | Bin 268 -> 0 bytes tools/DFBrowser/icons/treeline_backward.png | Bin 1299 -> 0 bytes tools/DFBrowser/icons/treeline_forward.png | Bin 1307 -> 0 bytes tools/DFBrowser/icons/treeline_update.png | Bin 1101 -> 0 bytes .../DFBrowserPane_AttributePane.cxx | 192 --- .../DFBrowserPane_AttributePane.hxx | 138 -- .../DFBrowserPane_AttributePaneAPI.hxx | 126 -- .../DFBrowserPane_AttributePaneCreator.cxx | 61 - .../DFBrowserPane_AttributePaneCreator.hxx | 46 - .../DFBrowserPane_AttributePaneCreatorAPI.hxx | 42 - .../DFBrowserPane_AttributePaneModel.cxx | 168 --- .../DFBrowserPane_AttributePaneModel.hxx | 125 -- .../DFBrowserPane_AttributePaneSelector.cxx | 94 -- .../DFBrowserPane_AttributePaneSelector.hxx | 72 -- .../DFBrowserPane_HelperArray.cxx | 94 -- .../DFBrowserPane_HelperArray.hxx | 67 - .../DFBrowserPane_HelperExport.cxx | 74 -- .../DFBrowserPane_HelperExport.hxx | 77 -- .../DFBrowserPane_ItemDelegateButton.cxx | 69 - .../DFBrowserPane_ItemDelegateButton.hxx | 83 -- .../DFBrowserPane/DFBrowserPane_ItemRole.hxx | 33 - .../DFBrowserPane_OcctEnumType.hxx | 34 - .../DFBrowserPane_SelectionKind.hxx | 28 - .../DFBrowserPane_TDFReference.cxx | 61 - .../DFBrowserPane_TDFReference.hxx | 50 - .../DFBrowserPane_TDataStdReferenceArray.cxx | 117 -- .../DFBrowserPane_TDataStdReferenceArray.hxx | 73 -- .../DFBrowserPane_TDataStdReferenceList.cxx | 69 - .../DFBrowserPane_TDataStdReferenceList.hxx | 50 - .../DFBrowserPane_TDataStdTreeNode.cxx | 192 --- .../DFBrowserPane_TDataStdTreeNode.hxx | 76 -- .../DFBrowserPane_TDataStdTreeNodeItem.cxx | 151 --- .../DFBrowserPane_TDataStdTreeNodeItem.hxx | 133 -- .../DFBrowserPane_TDataStdTreeNodeModel.cxx | 100 -- .../DFBrowserPane_TDataStdTreeNodeModel.hxx | 75 -- .../DFBrowserPane_TNamingNamedShape.cxx | 520 -------- .../DFBrowserPane_TNamingNamedShape.hxx | 116 -- .../DFBrowserPane_TNamingNaming.cxx | 221 ---- .../DFBrowserPane_TNamingNaming.hxx | 74 -- .../DFBrowserPane_TNamingUsedShapes.cxx | 159 --- .../DFBrowserPane_TNamingUsedShapes.hxx | 64 - .../DFBrowserPane/DFBrowserPane_TableView.cxx | 116 -- .../DFBrowserPane/DFBrowserPane_TableView.hxx | 76 -- tools/DFBrowserPane/DFBrowserPane_Tools.cxx | 166 --- tools/DFBrowserPane/DFBrowserPane_Tools.hxx | 83 -- tools/DFBrowserPane/FILES | 41 - tools/MessageModel/FILES | 14 - tools/MessageModel/MessageModel.qrc | 6 - .../MessageModel/MessageModel_ActionType.hxx | 32 - tools/MessageModel/MessageModel_Actions.cxx | 280 ----- tools/MessageModel/MessageModel_Actions.hxx | 99 -- tools/MessageModel/MessageModel_ItemAlert.cxx | 338 ----- tools/MessageModel/MessageModel_ItemAlert.hxx | 131 -- tools/MessageModel/MessageModel_ItemBase.cxx | 35 - tools/MessageModel/MessageModel_ItemBase.hxx | 52 - .../MessageModel/MessageModel_ItemReport.cxx | 243 ---- .../MessageModel/MessageModel_ItemReport.hxx | 126 -- tools/MessageModel/MessageModel_ItemRoot.cxx | 96 -- tools/MessageModel/MessageModel_ItemRoot.hxx | 129 -- tools/MessageModel/MessageModel_TreeModel.cxx | 209 --- tools/MessageModel/MessageModel_TreeModel.hxx | 97 -- tools/MessageModel/icons/item_shape.png | Bin 614 -> 0 bytes .../MessageModel/icons/item_streamValues.png | Bin 347 -> 0 bytes tools/MessageView/FILES | 10 - tools/MessageView/MessageView_ActionsTest.cxx | 367 ------ tools/MessageView/MessageView_ActionsTest.hxx | 82 -- .../MessageView/MessageView_Communicator.cxx | 25 - .../MessageView/MessageView_Communicator.hxx | 78 -- .../MessageView_MetricStatisticModel.cxx | 162 --- .../MessageView_MetricStatisticModel.hxx | 105 -- .../MessageView_VisibilityState.cxx | 82 -- .../MessageView_VisibilityState.hxx | 92 -- tools/MessageView/MessageView_Window.cxx | 782 ------------ tools/MessageView/MessageView_Window.hxx | 202 --- tools/ReadMe.md | 18 + tools/ShapeView/FILES | 19 - tools/ShapeView/ShapeView.qrc | 6 - tools/ShapeView/ShapeView_Communicator.cxx | 25 - tools/ShapeView/ShapeView_Communicator.hxx | 78 -- tools/ShapeView/ShapeView_ItemRoot.cxx | 56 - tools/ShapeView/ShapeView_ItemRoot.hxx | 83 -- tools/ShapeView/ShapeView_ItemShape.cxx | 183 --- tools/ShapeView/ShapeView_ItemShape.hxx | 137 -- tools/ShapeView/ShapeView_OpenFileDialog.cxx | 300 ----- tools/ShapeView/ShapeView_OpenFileDialog.hxx | 149 --- .../ShapeView/ShapeView_OpenFileViewModel.cxx | 80 -- .../ShapeView/ShapeView_OpenFileViewModel.hxx | 106 -- tools/ShapeView/ShapeView_Tools.cxx | 48 - tools/ShapeView/ShapeView_Tools.hxx | 50 - tools/ShapeView/ShapeView_TreeModel.cxx | 89 -- tools/ShapeView/ShapeView_TreeModel.hxx | 61 - tools/ShapeView/ShapeView_VisibilityState.cxx | 64 - tools/ShapeView/ShapeView_VisibilityState.hxx | 98 -- tools/ShapeView/ShapeView_Window.cxx | 552 -------- tools/ShapeView/ShapeView_Window.hxx | 160 --- tools/ShapeView/icons/folder_import.png | Bin 1398 -> 0 bytes tools/ShapeView/icons/folder_open.png | Bin 1957 -> 0 bytes tools/TInspector/FILES | 17 - tools/TInspector/TInspector.qrc | 7 - tools/TInspector/TInspector_Communicator.cxx | 117 -- tools/TInspector/TInspector_Communicator.hxx | 150 --- tools/TInspector/TInspector_OpenButton.cxx | 102 -- tools/TInspector/TInspector_OpenButton.hxx | 67 - .../TInspector/TInspector_OpenFileDialog.cxx | 292 ----- .../TInspector/TInspector_OpenFileDialog.hxx | 119 -- .../TInspector_OpenFileViewModel.cxx | 80 -- .../TInspector_OpenFileViewModel.hxx | 107 -- .../TInspector_PluginParameters.cxx | 58 - .../TInspector_PluginParameters.hxx | 79 -- tools/TInspector/TInspector_Preferences.cxx | 172 --- tools/TInspector/TInspector_Preferences.hxx | 113 -- tools/TInspector/TInspector_Shortcut.cxx | 56 - tools/TInspector/TInspector_Shortcut.hxx | 48 - tools/TInspector/TInspector_Window.cxx | 607 --------- tools/TInspector/TInspector_Window.hxx | 212 ---- tools/TInspector/icons/folder_export.png | Bin 1212 -> 0 bytes tools/TInspector/icons/folder_import.png | Bin 1398 -> 0 bytes tools/TInspector/icons/folder_open.png | Bin 1957 -> 0 bytes tools/TInspector/icons/plugin_actions.png | Bin 204 -> 0 bytes tools/TInspectorAPI/FILES | 5 - .../TInspectorAPI_Communicator.cxx | 72 -- .../TInspectorAPI_Communicator.hxx | 83 -- .../TInspectorAPI_PluginParameters.cxx | 295 ----- .../TInspectorAPI_PluginParameters.hxx | 170 --- .../TInspectorAPI_PreferencesDataMap.hxx | 27 - tools/TInspectorEXE/CMakeLists.txt | 12 - tools/TInspectorEXE/EXTERNLIB | 4 - tools/TInspectorEXE/FILES | 2 - tools/TInspectorEXE/TInspectorEXE.cxx | 154 --- tools/TKDFBrowser/CMakeLists.txt | 10 - tools/TKDFBrowser/EXTERNLIB | 27 - tools/TKDFBrowser/FILES | 2 - tools/TKDFBrowser/PACKAGES | 2 - tools/TKMessageModel/CMakeLists.txt | 10 - tools/TKMessageModel/EXTERNLIB | 10 - tools/TKMessageModel/FILES | 2 - tools/TKMessageModel/PACKAGES | 1 - tools/TKMessageView/CMakeLists.txt | 10 - tools/TKMessageView/EXTERNLIB | 13 - tools/TKMessageView/FILES | 2 - tools/TKMessageView/PACKAGES | 1 - tools/TKShapeView/CMakeLists.txt | 10 - tools/TKShapeView/EXTERNLIB | 11 - tools/TKShapeView/FILES | 2 - tools/TKShapeView/PACKAGES | 1 - tools/TKTInspector/CMakeLists.txt | 14 - tools/TKTInspector/EXTERNLIB | 4 - tools/TKTInspector/FILES | 2 - tools/TKTInspector/PACKAGES | 1 - tools/TKTInspectorAPI/CMakeLists.txt | 14 - tools/TKTInspectorAPI/EXTERNLIB | 8 - tools/TKTInspectorAPI/FILES | 2 - tools/TKTInspectorAPI/PACKAGES | 3 - tools/TKToolsDraw/CMakeLists.txt | 10 - tools/TKToolsDraw/EXTERNLIB | 9 - tools/TKToolsDraw/FILES | 2 - tools/TKToolsDraw/PACKAGES | 1 - tools/TKTreeModel/CMakeLists.txt | 10 - tools/TKTreeModel/EXTERNLIB | 6 - tools/TKTreeModel/FILES | 2 - tools/TKTreeModel/PACKAGES | 2 - tools/TKVInspector/CMakeLists.txt | 10 - tools/TKVInspector/EXTERNLIB | 12 - tools/TKVInspector/FILES | 2 - tools/TKVInspector/PACKAGES | 1 - tools/TKView/CMakeLists.txt | 10 - tools/TKView/EXTERNLIB | 9 - tools/TKView/FILES | 2 - tools/TKView/PACKAGES | 1 - tools/ToolsDraw/FILES | 2 - tools/ToolsDraw/ToolsDraw.cxx | 467 ------- tools/ToolsDraw/ToolsDraw.hxx | 45 - tools/TreeModel/FILES | 18 - tools/TreeModel/TreeModel.qrc | 6 - tools/TreeModel/TreeModel_ColumnType.hxx | 31 - tools/TreeModel/TreeModel_ContextMenu.cxx | 88 -- tools/TreeModel/TreeModel_ContextMenu.hxx | 53 - tools/TreeModel/TreeModel_HeaderSection.hxx | 99 -- tools/TreeModel/TreeModel_ItemBase.cxx | 212 ---- tools/TreeModel/TreeModel_ItemBase.hxx | 259 ---- tools/TreeModel/TreeModel_ItemProperties.cxx | 344 ----- tools/TreeModel/TreeModel_ItemProperties.hxx | 183 --- tools/TreeModel/TreeModel_ItemRole.hxx | 31 - tools/TreeModel/TreeModel_ItemStream.cxx | 133 -- tools/TreeModel/TreeModel_ItemStream.hxx | 105 -- tools/TreeModel/TreeModel_ModelBase.cxx | 371 ------ tools/TreeModel/TreeModel_ModelBase.hxx | 246 ---- tools/TreeModel/TreeModel_Tools.cxx | 257 ---- tools/TreeModel/TreeModel_Tools.hxx | 120 -- tools/TreeModel/TreeModel_VisibilityState.cxx | 32 - tools/TreeModel/TreeModel_VisibilityState.hxx | 75 -- tools/TreeModel/icons/item_invisible.png | Bin 446 -> 0 bytes tools/TreeModel/icons/item_visible.png | Bin 478 -> 0 bytes tools/VInspector/FILES | 26 - tools/VInspector/VInspector.qrc | 7 - tools/VInspector/VInspector_Communicator.cxx | 48 - tools/VInspector/VInspector_Communicator.hxx | 77 -- tools/VInspector/VInspector_ItemBase.cxx | 93 -- tools/VInspector/VInspector_ItemBase.hxx | 87 -- tools/VInspector/VInspector_ItemContext.cxx | 150 --- tools/VInspector/VInspector_ItemContext.hxx | 94 -- .../VInspector_ItemContextProperties.cxx | 93 -- .../VInspector_ItemContextProperties.hxx | 77 -- .../VInspector_ItemGraphic3dCLight.cxx | 245 ---- .../VInspector_ItemGraphic3dCLight.hxx | 101 -- .../VInspector_ItemPresentableObject.cxx | 252 ---- .../VInspector_ItemPresentableObject.hxx | 120 -- ...VInspector_ItemSelectMgrViewerSelector.cxx | 108 -- ...VInspector_ItemSelectMgrViewerSelector.hxx | 99 -- tools/VInspector/VInspector_ItemV3dViewer.cxx | 108 -- tools/VInspector/VInspector_ItemV3dViewer.hxx | 92 -- .../VInspector/VInspector_ToolActionType.hxx | 27 - tools/VInspector/VInspector_ToolBar.cxx | 85 -- tools/VInspector/VInspector_ToolBar.hxx | 67 - tools/VInspector/VInspector_Tools.cxx | 400 ------ tools/VInspector/VInspector_Tools.hxx | 150 --- tools/VInspector/VInspector_ViewModel.cxx | 147 --- tools/VInspector/VInspector_ViewModel.hxx | 85 -- tools/VInspector/VInspector_Window.cxx | 1039 --------------- tools/VInspector/VInspector_Window.hxx | 213 ---- tools/VInspector/icons/treeview_and.png | Bin 604 -> 0 bytes tools/VInspector/icons/treeview_or.png | Bin 231 -> 0 bytes tools/VInspector/icons/treeview_update.png | Bin 1101 -> 0 bytes tools/View/FILES | 21 - tools/View/View.qrc | 13 - tools/View/View_ContextType.hxx | 28 - tools/View/View_DisplayActionType.hxx | 29 - tools/View/View_DisplayPreview.cxx | 163 --- tools/View/View_DisplayPreview.hxx | 78 -- tools/View/View_Displayer.cxx | 436 ------- tools/View/View_Displayer.hxx | 225 ---- tools/View/View_PresentationType.hxx | 26 - tools/View/View_PreviewParameters.cxx | 57 - tools/View/View_PreviewParameters.hxx | 80 -- tools/View/View_ToolActionType.hxx | 29 - tools/View/View_ToolBar.cxx | 245 ---- tools/View/View_ToolBar.hxx | 122 -- tools/View/View_ToolButton.hxx | 73 -- tools/View/View_ViewActionType.hxx | 27 - tools/View/View_Viewer.cxx | 69 - tools/View/View_Viewer.hxx | 81 -- tools/View/View_Widget.cxx | 402 ------ tools/View/View_Widget.hxx | 240 ---- tools/View/View_Window.cxx | 335 ----- tools/View/View_Window.hxx | 141 --- tools/View/icons/keep_view_off.png | Bin 254 -> 0 bytes tools/View/icons/keep_view_on.png | Bin 581 -> 0 bytes tools/View/icons/trihedron.png | Bin 698 -> 0 bytes tools/View/icons/view_clear.png | Bin 270 -> 0 bytes tools/View/icons/view_cube.png | Bin 331 -> 0 bytes tools/View/icons/view_dm_shading.png | Bin 231 -> 0 bytes tools/View/icons/view_dm_wireframe.png | Bin 273 -> 0 bytes tools/View/icons/view_fitall.png | Bin 231 -> 0 bytes tools/ViewControl/FILES | 18 - .../ViewControl/ViewControl_ColorSelector.cxx | 591 --------- .../ViewControl/ViewControl_ColorSelector.hxx | 93 -- tools/ViewControl/ViewControl_EditType.hxx | 31 - .../ViewControl/ViewControl_MessageDialog.cxx | 131 -- .../ViewControl/ViewControl_MessageDialog.hxx | 93 -- .../ViewControl/ViewControl_PropertyView.cxx | 220 ---- .../ViewControl/ViewControl_PropertyView.hxx | 119 -- tools/ViewControl/ViewControl_Table.cxx | 178 --- tools/ViewControl/ViewControl_Table.hxx | 98 -- .../ViewControl_TableItemDelegate.cxx | 220 ---- .../ViewControl_TableItemDelegate.hxx | 107 -- tools/ViewControl/ViewControl_TableModel.cxx | 84 -- tools/ViewControl/ViewControl_TableModel.hxx | 111 -- .../ViewControl_TableModelValues.cxx | 152 --- .../ViewControl_TableModelValues.hxx | 180 --- tools/ViewControl/ViewControl_Tools.cxx | 153 --- tools/ViewControl/ViewControl_Tools.hxx | 92 -- tools/ViewControl/ViewControl_TreeView.hxx | 57 - .../adm/cmake/occt_toolkit_prepare_tool.cmake | 5 - 398 files changed, 37 insertions(+), 36317 deletions(-) delete mode 100644 adm/TOOLS delete mode 100644 adm/cmake/occt_toolkit_prepare_tool.cmake delete mode 100644 adm/templates/TInspectorEXE.vcxproj.user.in delete mode 100644 adm/templates/inspector.bat delete mode 100644 adm/templates/inspector.sh delete mode 100644 dox/user_guides/inspector/images/3DView.png delete mode 100644 dox/user_guides/inspector/images/3DView_elements.svg delete mode 100644 dox/user_guides/inspector/images/3DView_set_orientation.png delete mode 100644 dox/user_guides/inspector/images/TStandaloneEXE.png delete mode 100644 dox/user_guides/inspector/images/TStandaloneEXE_open.png delete mode 100644 dox/user_guides/inspector/images/VStudio_projects.png delete mode 100644 dox/user_guides/inspector/images/dfbrowser.png delete mode 100644 dox/user_guides/inspector/images/dfbrowser_elements.svg delete mode 100644 dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg delete mode 100644 dox/user_guides/inspector/images/display_additional_presentation.png delete mode 100644 dox/user_guides/inspector/images/display_main_presentation.png delete mode 100644 dox/user_guides/inspector/images/drawexe_tinspector.png delete mode 100644 dox/user_guides/inspector/images/dump_attribute.png delete mode 100644 dox/user_guides/inspector/images/messageview_dump_panel.png delete mode 100644 dox/user_guides/inspector/images/messageview_elements.svg delete mode 100644 dox/user_guides/inspector/images/messageview_pop_up_menu.png delete mode 100644 dox/user_guides/inspector/images/messageview_property_panel_custom.png delete mode 100644 dox/user_guides/inspector/images/messageview_view.png delete mode 100644 dox/user_guides/inspector/images/preferences.png delete mode 100644 dox/user_guides/inspector/images/property_panel.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_array.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_item_selection.svg delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_label.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_named_data.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_simple_type.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_tnaming_named_shape.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_tnaming_naming.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_tnaming_used_shapes.png delete mode 100644 dox/user_guides/inspector/images/property_panel_custom_tree_node.png delete mode 100644 dox/user_guides/inspector/images/search.png delete mode 100644 dox/user_guides/inspector/images/shapeview.png delete mode 100644 dox/user_guides/inspector/images/shapeview_elements.svg delete mode 100644 dox/user_guides/inspector/images/shapeview_property_panel.png delete mode 100644 dox/user_guides/inspector/images/shapeview_tree_columns.png delete mode 100644 dox/user_guides/inspector/images/tinspector_elements.svg delete mode 100644 dox/user_guides/inspector/images/treeview_preferences.svg delete mode 100644 dox/user_guides/inspector/images/vinspector.png delete mode 100644 dox/user_guides/inspector/images/vinspector_elements.svg delete mode 100644 dox/user_guides/inspector/images/vinspector_light_setting.png delete mode 100644 dox/user_guides/inspector/images/vinspector_property_panel.png delete mode 100644 dox/user_guides/inspector/images/vinspector_tree_columns.png delete mode 100644 dox/user_guides/inspector/inspector.md delete mode 100644 tools/CMakeLists.txt delete mode 100644 tools/Convert/Convert_Tools.cxx delete mode 100644 tools/Convert/Convert_Tools.hxx delete mode 100644 tools/Convert/Convert_TransientShape.hxx delete mode 100644 tools/Convert/FILES delete mode 100644 tools/DFBrowser/DFBrowser.qrc delete mode 100644 tools/DFBrowser/DFBrowser_AttributePaneStack.cxx delete mode 100644 tools/DFBrowser/DFBrowser_AttributePaneStack.hxx delete mode 100644 tools/DFBrowser/DFBrowser_AttributePaneType.hxx delete mode 100644 tools/DFBrowser/DFBrowser_Communicator.cxx delete mode 100644 tools/DFBrowser/DFBrowser_Communicator.hxx delete mode 100644 tools/DFBrowser/DFBrowser_DumpView.cxx delete mode 100644 tools/DFBrowser/DFBrowser_DumpView.hxx delete mode 100644 tools/DFBrowser/DFBrowser_HighlightDelegate.cxx delete mode 100644 tools/DFBrowser/DFBrowser_HighlightDelegate.hxx delete mode 100644 tools/DFBrowser/DFBrowser_Item.cxx delete mode 100644 tools/DFBrowser/DFBrowser_Item.hxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemApplication.cxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemApplication.hxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemBase.cxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemBase.hxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemDocument.cxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemDocument.hxx delete mode 100644 tools/DFBrowser/DFBrowser_ItemRole.hxx delete mode 100644 tools/DFBrowser/DFBrowser_Module.cxx delete mode 100644 tools/DFBrowser/DFBrowser_Module.hxx delete mode 100644 tools/DFBrowser/DFBrowser_OpenApplication.cxx delete mode 100644 tools/DFBrowser/DFBrowser_OpenApplication.hxx delete mode 100644 tools/DFBrowser/DFBrowser_PropertyPanel.cxx delete mode 100644 tools/DFBrowser/DFBrowser_PropertyPanel.hxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchItemInfo.hxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchLine.cxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchLine.hxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchLineModel.cxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchLineModel.hxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchView.cxx delete mode 100644 tools/DFBrowser/DFBrowser_SearchView.hxx delete mode 100644 tools/DFBrowser/DFBrowser_Tools.cxx delete mode 100644 tools/DFBrowser/DFBrowser_Tools.hxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelLine.cxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelLine.hxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.hxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelLineModel.cxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelLineModel.hxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelView.cxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelView.hxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeLevelViewModel.hxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeModel.cxx delete mode 100644 tools/DFBrowser/DFBrowser_TreeModel.hxx delete mode 100644 tools/DFBrowser/DFBrowser_Window.cxx delete mode 100644 tools/DFBrowser/DFBrowser_Window.hxx delete mode 100644 tools/DFBrowser/FILES delete mode 100644 tools/DFBrowser/icons/attribute.png delete mode 100644 tools/DFBrowser/icons/attribute_40x40.png delete mode 100644 tools/DFBrowser/icons/export_shape.png delete mode 100644 tools/DFBrowser/icons/folder_export.png delete mode 100644 tools/DFBrowser/icons/item_type_folder.png delete mode 100644 tools/DFBrowser/icons/item_type_folder_40x40.png delete mode 100644 tools/DFBrowser/icons/level_change.png delete mode 100644 tools/DFBrowser/icons/named_shape.png delete mode 100644 tools/DFBrowser/icons/named_shape_40x40.png delete mode 100644 tools/DFBrowser/icons/search.png delete mode 100644 tools/DFBrowser/icons/search_cancel.png delete mode 100644 tools/DFBrowser/icons/treeline_backward.png delete mode 100644 tools/DFBrowser/icons/treeline_forward.png delete mode 100644 tools/DFBrowser/icons/treeline_update.png delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePane.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneAPI.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneCreatorAPI.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_HelperExport.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_SelectionKind.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDFReference.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TNamingNaming.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TNamingNaming.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TableView.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_TableView.hxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_Tools.cxx delete mode 100644 tools/DFBrowserPane/DFBrowserPane_Tools.hxx delete mode 100644 tools/DFBrowserPane/FILES delete mode 100644 tools/MessageModel/FILES delete mode 100644 tools/MessageModel/MessageModel.qrc delete mode 100644 tools/MessageModel/MessageModel_ActionType.hxx delete mode 100644 tools/MessageModel/MessageModel_Actions.cxx delete mode 100644 tools/MessageModel/MessageModel_Actions.hxx delete mode 100644 tools/MessageModel/MessageModel_ItemAlert.cxx delete mode 100644 tools/MessageModel/MessageModel_ItemAlert.hxx delete mode 100644 tools/MessageModel/MessageModel_ItemBase.cxx delete mode 100644 tools/MessageModel/MessageModel_ItemBase.hxx delete mode 100644 tools/MessageModel/MessageModel_ItemReport.cxx delete mode 100644 tools/MessageModel/MessageModel_ItemReport.hxx delete mode 100644 tools/MessageModel/MessageModel_ItemRoot.cxx delete mode 100644 tools/MessageModel/MessageModel_ItemRoot.hxx delete mode 100644 tools/MessageModel/MessageModel_TreeModel.cxx delete mode 100644 tools/MessageModel/MessageModel_TreeModel.hxx delete mode 100644 tools/MessageModel/icons/item_shape.png delete mode 100644 tools/MessageModel/icons/item_streamValues.png delete mode 100644 tools/MessageView/FILES delete mode 100644 tools/MessageView/MessageView_ActionsTest.cxx delete mode 100644 tools/MessageView/MessageView_ActionsTest.hxx delete mode 100644 tools/MessageView/MessageView_Communicator.cxx delete mode 100644 tools/MessageView/MessageView_Communicator.hxx delete mode 100644 tools/MessageView/MessageView_MetricStatisticModel.cxx delete mode 100644 tools/MessageView/MessageView_MetricStatisticModel.hxx delete mode 100644 tools/MessageView/MessageView_VisibilityState.cxx delete mode 100644 tools/MessageView/MessageView_VisibilityState.hxx delete mode 100644 tools/MessageView/MessageView_Window.cxx delete mode 100644 tools/MessageView/MessageView_Window.hxx create mode 100644 tools/ReadMe.md delete mode 100644 tools/ShapeView/FILES delete mode 100644 tools/ShapeView/ShapeView.qrc delete mode 100644 tools/ShapeView/ShapeView_Communicator.cxx delete mode 100644 tools/ShapeView/ShapeView_Communicator.hxx delete mode 100644 tools/ShapeView/ShapeView_ItemRoot.cxx delete mode 100644 tools/ShapeView/ShapeView_ItemRoot.hxx delete mode 100644 tools/ShapeView/ShapeView_ItemShape.cxx delete mode 100644 tools/ShapeView/ShapeView_ItemShape.hxx delete mode 100644 tools/ShapeView/ShapeView_OpenFileDialog.cxx delete mode 100644 tools/ShapeView/ShapeView_OpenFileDialog.hxx delete mode 100644 tools/ShapeView/ShapeView_OpenFileViewModel.cxx delete mode 100644 tools/ShapeView/ShapeView_OpenFileViewModel.hxx delete mode 100644 tools/ShapeView/ShapeView_Tools.cxx delete mode 100644 tools/ShapeView/ShapeView_Tools.hxx delete mode 100644 tools/ShapeView/ShapeView_TreeModel.cxx delete mode 100644 tools/ShapeView/ShapeView_TreeModel.hxx delete mode 100644 tools/ShapeView/ShapeView_VisibilityState.cxx delete mode 100644 tools/ShapeView/ShapeView_VisibilityState.hxx delete mode 100644 tools/ShapeView/ShapeView_Window.cxx delete mode 100644 tools/ShapeView/ShapeView_Window.hxx delete mode 100644 tools/ShapeView/icons/folder_import.png delete mode 100644 tools/ShapeView/icons/folder_open.png delete mode 100644 tools/TInspector/FILES delete mode 100644 tools/TInspector/TInspector.qrc delete mode 100644 tools/TInspector/TInspector_Communicator.cxx delete mode 100644 tools/TInspector/TInspector_Communicator.hxx delete mode 100644 tools/TInspector/TInspector_OpenButton.cxx delete mode 100644 tools/TInspector/TInspector_OpenButton.hxx delete mode 100644 tools/TInspector/TInspector_OpenFileDialog.cxx delete mode 100644 tools/TInspector/TInspector_OpenFileDialog.hxx delete mode 100644 tools/TInspector/TInspector_OpenFileViewModel.cxx delete mode 100644 tools/TInspector/TInspector_OpenFileViewModel.hxx delete mode 100644 tools/TInspector/TInspector_PluginParameters.cxx delete mode 100644 tools/TInspector/TInspector_PluginParameters.hxx delete mode 100644 tools/TInspector/TInspector_Preferences.cxx delete mode 100644 tools/TInspector/TInspector_Preferences.hxx delete mode 100644 tools/TInspector/TInspector_Shortcut.cxx delete mode 100644 tools/TInspector/TInspector_Shortcut.hxx delete mode 100644 tools/TInspector/TInspector_Window.cxx delete mode 100644 tools/TInspector/TInspector_Window.hxx delete mode 100644 tools/TInspector/icons/folder_export.png delete mode 100644 tools/TInspector/icons/folder_import.png delete mode 100644 tools/TInspector/icons/folder_open.png delete mode 100644 tools/TInspector/icons/plugin_actions.png delete mode 100644 tools/TInspectorAPI/FILES delete mode 100644 tools/TInspectorAPI/TInspectorAPI_Communicator.cxx delete mode 100644 tools/TInspectorAPI/TInspectorAPI_Communicator.hxx delete mode 100644 tools/TInspectorAPI/TInspectorAPI_PluginParameters.cxx delete mode 100644 tools/TInspectorAPI/TInspectorAPI_PluginParameters.hxx delete mode 100644 tools/TInspectorAPI/TInspectorAPI_PreferencesDataMap.hxx delete mode 100644 tools/TInspectorEXE/CMakeLists.txt delete mode 100644 tools/TInspectorEXE/EXTERNLIB delete mode 100644 tools/TInspectorEXE/FILES delete mode 100644 tools/TInspectorEXE/TInspectorEXE.cxx delete mode 100644 tools/TKDFBrowser/CMakeLists.txt delete mode 100644 tools/TKDFBrowser/EXTERNLIB delete mode 100644 tools/TKDFBrowser/FILES delete mode 100644 tools/TKDFBrowser/PACKAGES delete mode 100644 tools/TKMessageModel/CMakeLists.txt delete mode 100644 tools/TKMessageModel/EXTERNLIB delete mode 100644 tools/TKMessageModel/FILES delete mode 100644 tools/TKMessageModel/PACKAGES delete mode 100644 tools/TKMessageView/CMakeLists.txt delete mode 100644 tools/TKMessageView/EXTERNLIB delete mode 100644 tools/TKMessageView/FILES delete mode 100644 tools/TKMessageView/PACKAGES delete mode 100644 tools/TKShapeView/CMakeLists.txt delete mode 100644 tools/TKShapeView/EXTERNLIB delete mode 100644 tools/TKShapeView/FILES delete mode 100644 tools/TKShapeView/PACKAGES delete mode 100644 tools/TKTInspector/CMakeLists.txt delete mode 100644 tools/TKTInspector/EXTERNLIB delete mode 100644 tools/TKTInspector/FILES delete mode 100644 tools/TKTInspector/PACKAGES delete mode 100644 tools/TKTInspectorAPI/CMakeLists.txt delete mode 100644 tools/TKTInspectorAPI/EXTERNLIB delete mode 100644 tools/TKTInspectorAPI/FILES delete mode 100644 tools/TKTInspectorAPI/PACKAGES delete mode 100644 tools/TKToolsDraw/CMakeLists.txt delete mode 100644 tools/TKToolsDraw/EXTERNLIB delete mode 100644 tools/TKToolsDraw/FILES delete mode 100644 tools/TKToolsDraw/PACKAGES delete mode 100644 tools/TKTreeModel/CMakeLists.txt delete mode 100644 tools/TKTreeModel/EXTERNLIB delete mode 100644 tools/TKTreeModel/FILES delete mode 100644 tools/TKTreeModel/PACKAGES delete mode 100644 tools/TKVInspector/CMakeLists.txt delete mode 100644 tools/TKVInspector/EXTERNLIB delete mode 100644 tools/TKVInspector/FILES delete mode 100644 tools/TKVInspector/PACKAGES delete mode 100644 tools/TKView/CMakeLists.txt delete mode 100644 tools/TKView/EXTERNLIB delete mode 100644 tools/TKView/FILES delete mode 100644 tools/TKView/PACKAGES delete mode 100644 tools/ToolsDraw/FILES delete mode 100644 tools/ToolsDraw/ToolsDraw.cxx delete mode 100644 tools/ToolsDraw/ToolsDraw.hxx delete mode 100644 tools/TreeModel/FILES delete mode 100644 tools/TreeModel/TreeModel.qrc delete mode 100644 tools/TreeModel/TreeModel_ColumnType.hxx delete mode 100644 tools/TreeModel/TreeModel_ContextMenu.cxx delete mode 100644 tools/TreeModel/TreeModel_ContextMenu.hxx delete mode 100644 tools/TreeModel/TreeModel_HeaderSection.hxx delete mode 100644 tools/TreeModel/TreeModel_ItemBase.cxx delete mode 100644 tools/TreeModel/TreeModel_ItemBase.hxx delete mode 100644 tools/TreeModel/TreeModel_ItemProperties.cxx delete mode 100644 tools/TreeModel/TreeModel_ItemProperties.hxx delete mode 100644 tools/TreeModel/TreeModel_ItemRole.hxx delete mode 100644 tools/TreeModel/TreeModel_ItemStream.cxx delete mode 100644 tools/TreeModel/TreeModel_ItemStream.hxx delete mode 100644 tools/TreeModel/TreeModel_ModelBase.cxx delete mode 100644 tools/TreeModel/TreeModel_ModelBase.hxx delete mode 100644 tools/TreeModel/TreeModel_Tools.cxx delete mode 100644 tools/TreeModel/TreeModel_Tools.hxx delete mode 100644 tools/TreeModel/TreeModel_VisibilityState.cxx delete mode 100644 tools/TreeModel/TreeModel_VisibilityState.hxx delete mode 100644 tools/TreeModel/icons/item_invisible.png delete mode 100644 tools/TreeModel/icons/item_visible.png delete mode 100644 tools/VInspector/FILES delete mode 100644 tools/VInspector/VInspector.qrc delete mode 100644 tools/VInspector/VInspector_Communicator.cxx delete mode 100644 tools/VInspector/VInspector_Communicator.hxx delete mode 100644 tools/VInspector/VInspector_ItemBase.cxx delete mode 100644 tools/VInspector/VInspector_ItemBase.hxx delete mode 100644 tools/VInspector/VInspector_ItemContext.cxx delete mode 100644 tools/VInspector/VInspector_ItemContext.hxx delete mode 100644 tools/VInspector/VInspector_ItemContextProperties.cxx delete mode 100644 tools/VInspector/VInspector_ItemContextProperties.hxx delete mode 100644 tools/VInspector/VInspector_ItemGraphic3dCLight.cxx delete mode 100644 tools/VInspector/VInspector_ItemGraphic3dCLight.hxx delete mode 100644 tools/VInspector/VInspector_ItemPresentableObject.cxx delete mode 100644 tools/VInspector/VInspector_ItemPresentableObject.hxx delete mode 100644 tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx delete mode 100644 tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx delete mode 100644 tools/VInspector/VInspector_ItemV3dViewer.cxx delete mode 100644 tools/VInspector/VInspector_ItemV3dViewer.hxx delete mode 100644 tools/VInspector/VInspector_ToolActionType.hxx delete mode 100644 tools/VInspector/VInspector_ToolBar.cxx delete mode 100644 tools/VInspector/VInspector_ToolBar.hxx delete mode 100644 tools/VInspector/VInspector_Tools.cxx delete mode 100644 tools/VInspector/VInspector_Tools.hxx delete mode 100644 tools/VInspector/VInspector_ViewModel.cxx delete mode 100644 tools/VInspector/VInspector_ViewModel.hxx delete mode 100644 tools/VInspector/VInspector_Window.cxx delete mode 100644 tools/VInspector/VInspector_Window.hxx delete mode 100644 tools/VInspector/icons/treeview_and.png delete mode 100644 tools/VInspector/icons/treeview_or.png delete mode 100644 tools/VInspector/icons/treeview_update.png delete mode 100644 tools/View/FILES delete mode 100644 tools/View/View.qrc delete mode 100644 tools/View/View_ContextType.hxx delete mode 100644 tools/View/View_DisplayActionType.hxx delete mode 100644 tools/View/View_DisplayPreview.cxx delete mode 100644 tools/View/View_DisplayPreview.hxx delete mode 100644 tools/View/View_Displayer.cxx delete mode 100644 tools/View/View_Displayer.hxx delete mode 100644 tools/View/View_PresentationType.hxx delete mode 100644 tools/View/View_PreviewParameters.cxx delete mode 100644 tools/View/View_PreviewParameters.hxx delete mode 100644 tools/View/View_ToolActionType.hxx delete mode 100644 tools/View/View_ToolBar.cxx delete mode 100644 tools/View/View_ToolBar.hxx delete mode 100644 tools/View/View_ToolButton.hxx delete mode 100644 tools/View/View_ViewActionType.hxx delete mode 100644 tools/View/View_Viewer.cxx delete mode 100644 tools/View/View_Viewer.hxx delete mode 100644 tools/View/View_Widget.cxx delete mode 100644 tools/View/View_Widget.hxx delete mode 100644 tools/View/View_Window.cxx delete mode 100644 tools/View/View_Window.hxx delete mode 100644 tools/View/icons/keep_view_off.png delete mode 100644 tools/View/icons/keep_view_on.png delete mode 100644 tools/View/icons/trihedron.png delete mode 100644 tools/View/icons/view_clear.png delete mode 100644 tools/View/icons/view_cube.png delete mode 100644 tools/View/icons/view_dm_shading.png delete mode 100644 tools/View/icons/view_dm_wireframe.png delete mode 100644 tools/View/icons/view_fitall.png delete mode 100644 tools/ViewControl/FILES delete mode 100644 tools/ViewControl/ViewControl_ColorSelector.cxx delete mode 100644 tools/ViewControl/ViewControl_ColorSelector.hxx delete mode 100644 tools/ViewControl/ViewControl_EditType.hxx delete mode 100644 tools/ViewControl/ViewControl_MessageDialog.cxx delete mode 100644 tools/ViewControl/ViewControl_MessageDialog.hxx delete mode 100644 tools/ViewControl/ViewControl_PropertyView.cxx delete mode 100644 tools/ViewControl/ViewControl_PropertyView.hxx delete mode 100644 tools/ViewControl/ViewControl_Table.cxx delete mode 100644 tools/ViewControl/ViewControl_Table.hxx delete mode 100644 tools/ViewControl/ViewControl_TableItemDelegate.cxx delete mode 100644 tools/ViewControl/ViewControl_TableItemDelegate.hxx delete mode 100644 tools/ViewControl/ViewControl_TableModel.cxx delete mode 100644 tools/ViewControl/ViewControl_TableModel.hxx delete mode 100644 tools/ViewControl/ViewControl_TableModelValues.cxx delete mode 100644 tools/ViewControl/ViewControl_TableModelValues.hxx delete mode 100644 tools/ViewControl/ViewControl_Tools.cxx delete mode 100644 tools/ViewControl/ViewControl_Tools.hxx delete mode 100644 tools/ViewControl/ViewControl_TreeView.hxx delete mode 100644 tools/adm/cmake/occt_toolkit_prepare_tool.cmake diff --git a/.github/actions/build-tinspector/action.yml b/.github/actions/build-tinspector/action.yml index da9434e453..2cd9639be7 100644 --- a/.github/actions/build-tinspector/action.yml +++ b/.github/actions/build-tinspector/action.yml @@ -35,11 +35,18 @@ runs: shell: bash run: sudo apt-get update && sudo apt-get install -y tcl-dev tk-dev cmake gcc g++ make libbtbb-dev libx11-dev libglu1-mesa-dev tcllib tcl-thread tcl libvtk9-dev libopenvr-dev libdraco-dev libfreeimage-dev libegl1-mesa-dev libgles2-mesa-dev libfreetype-dev qtbase5-dev qt5-qmake qtbase5-dev-tools qtdeclarative5-dev qttools5-dev qttools5-dev-tools + - name: Checkout TInspector + shell: bash + run: | + git clone https://github.com/Open-Cascade-SAS/Inspector.git inspector + cd inspector + git checkout 6da9ba776ef72a17dca3331974df4200024c7f34 + - name: Configure TInspector - Windows if: inputs.platform == 'windows' shell: pwsh run: | - cd tools + cd inspector mkdir build cd build cmake -G "Visual Studio 17 2022" -A x64 ` @@ -47,40 +54,40 @@ runs: -D BUILD_SHARED_LIBS=ON ` -D 3RDPARTY_DIR=${{ github.workspace }}//3rdparty-vc14-64 ` -D OpenCASCADE_DIR=${{ github.workspace }}/occt-install ` - -D INSTALL_DIR=${{ github.workspace }}/tools/install ` + -D INSTALL_DIR=${{ github.workspace }}/inspector/install ` .. - name: Configure TInspector - Linux if: inputs.platform == 'linux' shell: bash run: | - cd tools + cd inspector mkdir build cd build cmake -G "Unix Makefiles" \ -D CMAKE_BUILD_TYPE=Release \ -D BUILD_SHARED_LIBS=ON \ -D OpenCASCADE_DIR=${{ github.workspace }}/occt-install \ - -D INSTALL_DIR=${{ github.workspace }}/tools/install \ + -D INSTALL_DIR=${{ github.workspace }}/inspector/install \ .. - name: Build TInspector - Windows if: inputs.platform == 'windows' shell: pwsh run: | - cd tools/build + cd inspector/build cmake --build . --config Release --target install - name: Build TInspector - Linux if: inputs.platform == 'linux' shell: bash run: | - cd tools/build + cd inspector/build make install -j$(nproc) - name: Upload TInspector installation uses: actions/upload-artifact@v4.4.3 with: name: inspector-${{ inputs.platform }}-x64 - path: tools/install + path: inspector/install retention-days: 7 diff --git a/.github/actions/clang-format-check/action.yml b/.github/actions/clang-format-check/action.yml index 4eabdf02a5..0f88184e4b 100644 --- a/.github/actions/clang-format-check/action.yml +++ b/.github/actions/clang-format-check/action.yml @@ -8,7 +8,7 @@ inputs: file-pattern: description: 'Pattern to match files for formatting check' required: false - default: '^(src|tools)/.*\.(cpp|hxx|cxx|lxx|h|pxx|hpp)$' + default: '^(src)/.*\.(cpp|hxx|cxx|lxx|h|pxx|hpp)$' clang-format-version: description: 'Required clang-format version' required: false diff --git a/CMakeLists.txt b/CMakeLists.txt index 34300d41ad..cd8eeb35e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -327,8 +327,6 @@ if (MSVC) endif() set (BUILD_SAMPLES_QT OFF CACHE BOOL "${BUILD_SAMPLES_QT_DESCR}") -set (BUILD_Inspector OFF CACHE BOOL "${BUILD_Inspector_DESCR}") - # uwp sample if (MSVC) if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") @@ -745,8 +743,8 @@ else() OCCT_CHECK_AND_UNSET ("INSTALL_JEMALLOC") endif() -# qt for inspector and samples -if (BUILD_Inspector OR BUILD_SAMPLES_QT) +# qt for samples +if (BUILD_SAMPLES_QT) # check qt 3rdparty path add_definitions (-DHAVE_QT) list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/qt") @@ -1021,28 +1019,6 @@ else() set (SCRIPT_EXT sh) endif() -# OCCT tools -# include original list of tools -# list _TOOLKITS is created foreach tool and contains its toolkits -# list will contain all tools -if (BUILD_Inspector) - add_definitions (-DHAVE_Inspector) - - OCCT_MODULES_AND_TOOLKITS (TOOLS "TOOL_TOOLKITS" OCCT_TOOLS) - foreach (OCCT_TOOL ${OCCT_TOOLS}) - list (APPEND BUILD_TOOL_TOOLKITS ${${OCCT_TOOL}_TOOL_TOOLKITS}) - endforeach() - - # collect all the headers to /inc/inspector folder - - # Ensure the include directory exists - file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}/inspector") - - string(TIMESTAMP CURRENT_TIME "%H:%M:%S") - message (STATUS "\nInfo: \(${CURRENT_TIME}\) Start collecting all OCCT tool header files into ${CMAKE_BINARY_DIR}/inc/inspector ...") - COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOL_TOOLKITS}" "tools" "${INSTALL_DIR_INCLUDE}/inspector") -endif() - # OCCT samples # get absolute path from INSTALL_DIR set (INSTALL_DIR_ABSOLUTE "${INSTALL_DIR}") @@ -1227,13 +1203,6 @@ if (MSVC AND 3RDPARTY_DLL_DIRS) endif() endif() -# include patched toolkit projects or original ones -if (BUILD_TOOL_TOOLKITS) - foreach (BUILD_TOOL_TOOLKIT ${BUILD_TOOL_TOOLKITS}) - OCCT_ADD_SUBDIRECTORY ("tools/${BUILD_TOOL_TOOLKIT}") - endforeach() -endif() - message (STATUS "Info: \(${CURRENT_TIME}\) OCCT toolkits processed") # samples do not support patch usage if (BUILD_SAMPLES_MFC OR BUILD_SAMPLES_QT) @@ -1255,7 +1224,7 @@ endif() OCCT_MODULES_AND_TOOLKITS (SAMPLES "SAMPLES_TOOLKITS" OCCT_SAMPLES) -if (BUILD_Inspector OR BUILD_SAMPLES_QT) +if (BUILD_SAMPLES_QT) if (BUILD_SAMPLES_QT) if (NOT Qt5_FOUND OR "${Qt5Gui_EGL_INCLUDE_DIRS}" STREQUAL "" OR NOT WIN32) list (REMOVE_ITEM qt_SAMPLES_TOOLKITS AndroidQt) @@ -1284,15 +1253,6 @@ if (BUILD_MODULE_UwpSample) add_subdirectory(samples/xaml) endif() -if (BUILD_TOOL_TOOLKITS) - install (FILES "${CMAKE_SOURCE_DIR}/adm/templates/inspector.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}" - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - - set (OpenCASCADE_BINARY_DIR "${INSTALL_DIR}/${INSTALL_DIR_BIN}") - # patch TInspectorEXE - OCCT_CONFIGURE ("adm/templates/TInspectorEXE.vcxproj.user.in" "${CMAKE_BINARY_DIR}/tools/TInspectorEXE/TInspectorEXE.vcxproj.user") -endif() - # Prepare variables for configuration of OpenCASCADE cmake config file set (OCCT_MODULES_ENABLED) set (OCCT_LIBRARIES) diff --git a/adm/TOOLS b/adm/TOOLS deleted file mode 100644 index 57ddcfcc64..0000000000 --- a/adm/TOOLS +++ /dev/null @@ -1,4 +0,0 @@ -TModelingData TKShapeView TKMessageModel TKMessageView -TVisualization TKView TKVInspector -TApplicationFramework TKTreeModel TKTInspectorAPI TKDFBrowser -TTool TKTInspector TKToolsDraw TInspectorEXE \ No newline at end of file diff --git a/adm/UDLIST b/adm/UDLIST index 9441779af1..f32a3efad7 100644 --- a/adm/UDLIST +++ b/adm/UDLIST @@ -472,26 +472,6 @@ n RWGltf n RWMesh n RWObj n RWPly -n DFBrowser -n DFBrowserPane -n DFBrowserPaneXDE -n ShapeView -n TInspector -n TInspectorAPI -x TInspectorEXE -t TKDFBrowser -t TKShapeView -t TKTInspector -t TKTInspectorAPI -t TKToolsDraw -t TKTreeModel -t TKView -t TKVInspector -n ToolsDraw -n TreeModel -n View -n ViewControl -n VInspector n Express t TKExpress x ExpToCasExe diff --git a/adm/cmake/occt_toolkit_prepare_tool.cmake b/adm/cmake/occt_toolkit_prepare_tool.cmake deleted file mode 100644 index eed173ae63..0000000000 --- a/adm/cmake/occt_toolkit_prepare_tool.cmake +++ /dev/null @@ -1,13 +0,0 @@ -if ("${TARGET_FOLDER}" STREQUAL "") - set (USE_QT ON) - set (RELATIVE_DIR "tools") - set (MODULES_LIST ${OCCT_TOOLS}) - set (TARGET_FOLDER "Tools") - set (TOOLKITS_NAME_SUFFIX "TOOL_TOOLKITS") -else() - unset (USE_QT) - unset (RELATIVE_DIR) - unset (MODULES_LIST) - unset (TARGET_FOLDER) - unset (TOOLKITS_NAME_SUFFIX) -endif("${TARGET_FOLDER}" STREQUAL "") diff --git a/adm/cmake/vardescr.cmake b/adm/cmake/vardescr.cmake index d0cdd6946b..33702f089d 100644 --- a/adm/cmake/vardescr.cmake +++ b/adm/cmake/vardescr.cmake @@ -137,13 +137,6 @@ set (BUILD_SAMPLES_QT_DESCR These samples show some possibilities of using OCCT and they can be executed with script samples.bat from the installation directory (INSTALL_DIR)") -set (BUILD_Inspector_DESCR -"Indicates whether OCCT inspector should be built together with OCCT. -This inspector provides functionality to interactively inspect low-level content -of the OCAF data model, OCCT viewer, etc. have been introduced in OCCT. -It can be executed with script inspector.bat from the installation directory (INSTALL_DIR) or -using 'tinspector' command in DRAW interpretator") - set (BUILD_MODULE_UwpSample_DESCR "Indicates whether OCCT UWP sample should be built together with OCCT.") diff --git a/adm/scripts/cmake_custom.bat.template b/adm/scripts/cmake_custom.bat.template index fabb66c5a1..52bea95fd3 100644 --- a/adm/scripts/cmake_custom.bat.template +++ b/adm/scripts/cmake_custom.bat.template @@ -16,7 +16,6 @@ rem set "BUILD_DIR=build-vs%VS%-%VSPLATFORM%" rem set "INSTALL_DIR=%SrcRoot%\install" rem set BUILD_DOC_Overview=OFF -rem set BUILD_Inspector=OFF rem set BUILD_LIBRARY_TYPE=Shared rem set BUILD_RELEASE_DISABLE_EXCEPTIONS=ON rem set BUILD_WITH_DEBUG=OFF diff --git a/adm/scripts/cmake_custom.sh.template b/adm/scripts/cmake_custom.sh.template index b628e4a87e..0a164b5543 100644 --- a/adm/scripts/cmake_custom.sh.template +++ b/adm/scripts/cmake_custom.sh.template @@ -11,7 +11,6 @@ FREETYPE_DIR="$OCCT3RDPARTY/freetype-2.7.1" #INSTALL_DIR="$SrcRoot/install" #BUILD_DOC_Overview=OFF -#BUILD_Inspector=OFF #BUILD_LIBRARY_TYPE=Shared #BUILD_RELEASE_DISABLE_EXCEPTIONS=ON #BUILD_WITH_DEBUG=OFF diff --git a/adm/scripts/cmake_gen.bat b/adm/scripts/cmake_gen.bat index 6a1651ce0e..6a2545fcc1 100644 --- a/adm/scripts/cmake_gen.bat +++ b/adm/scripts/cmake_gen.bat @@ -17,7 +17,6 @@ set "INSTALL_DIR=%SrcRoot%\install" set BUILD_ADDITIONAL_TOOLKITS= set BUILD_DOC_Overview=OFF -set BUILD_Inspector=OFF set BUILD_LIBRARY_TYPE=Shared set BUILD_RELEASE_DISABLE_EXCEPTIONS=ON set BUILD_WITH_DEBUG=OFF @@ -58,7 +57,6 @@ cmake -G "%arch_compile%" ^ -D 3RDPARTY_DIR:STRING="%OCCT3RDPARTY%" ^ -D BUILD_ADDITIONAL_TOOLKITS:STRING="%BUILD_ADDITIONAL_TOOLKITS%" ^ -D BUILD_DOC_Overview:BOOL=%BUILD_DOC_Overview% ^ - -D BUILD_Inspector:BOOL=%BUILD_Inspector% ^ -D BUILD_LIBRARY_TYPE:STRING=%BUILD_LIBRARY_TYPE% ^ -D BUILD_MODULE_ApplicationFramework:BOOL=%BUILD_MODULE_ApplicationFramework% ^ -D BUILD_MODULE_DataExchange:BOOL=%BUILD_MODULE_DataExchange% ^ diff --git a/adm/scripts/cmake_gen.sh b/adm/scripts/cmake_gen.sh index 7ebd7d1e6d..fd38c6e8d4 100755 --- a/adm/scripts/cmake_gen.sh +++ b/adm/scripts/cmake_gen.sh @@ -22,7 +22,6 @@ INSTALL_DIR_LIB=lin64/gcc/lib$DEB BUILD_ADDITIONAL_TOOLKITS= BUILD_DOC_Overview=OFF -BUILD_Inspector=OFF BUILD_LIBRARY_TYPE=Shared BUILD_RELEASE_DISABLE_EXCEPTIONS=ON BUILD_WITH_DEBUG=OFF @@ -59,7 +58,6 @@ cmake -G "Unix Makefiles" \ -D 3RDPARTY_FREETYPE_DIR:PATH="$FREETYPE_DIR" \ -D BUILD_ADDITIONAL_TOOLKITS:STRING="$BUILD_ADDITIONAL_TOOLKITS" \ -D BUILD_DOC_Overview:BOOL=$BUILD_DOC_Overview \ - -D BUILD_Inspector:BOOL=$BUILD_Inspector \ -D BUILD_LIBRARY_TYPE:STRING=$BUILD_LIBRARY_TYPE \ -D BUILD_MODULE_ApplicationFramework:BOOL=$BUILD_MODULE_ApplicationFramework \ -D BUILD_MODULE_DataExchange:BOOL=$BUILD_MODULE_DataExchange \ diff --git a/adm/templates/TInspectorEXE.vcxproj.user.in b/adm/templates/TInspectorEXE.vcxproj.user.in deleted file mode 100644 index ff4fa981b7..0000000000 --- a/adm/templates/TInspectorEXE.vcxproj.user.in +++ /dev/null @@ -1,30 +0,0 @@ - - - - CASROOT=@CMAKE_SOURCE_DIR@ -CSF_OCCTDataPath=@CMAKE_SOURCE_DIR@/data -QTDIR=@3RDPARTY_QT_DIR@ -PATH=@3RDPARTY_DLL_DIRS_FOR_PATH@;@OpenCASCADE_BINARY_DIR@;%PATH% - - WindowsLocalDebugger - @CMAKE_BINARY_DIR@ - - - CASROOT=@CMAKE_SOURCE_DIR@ -CSF_OCCTDataPath=@CMAKE_SOURCE_DIR@/data -QTDIR=@3RDPARTY_QT_DIR@ -PATH=@3RDPARTY_DLL_DIRS_FOR_PATH@;@OpenCASCADE_BINARY_DIR@i;%PATH% - - WindowsLocalDebugger - @CMAKE_BINARY_DIR@ - - - CASROOT=@CMAKE_SOURCE_DIR@ -CSF_OCCTDataPath=@CMAKE_SOURCE_DIR@/data -QTDIR=@3RDPARTY_QT_DIR@ -PATH=@3RDPARTY_DLL_DIRS_FOR_PATH@;@OpenCASCADE_BINARY_DIR@d;%PATH% - - WindowsLocalDebugger - @CMAKE_BINARY_DIR@ - - \ No newline at end of file diff --git a/adm/templates/inspector.bat b/adm/templates/inspector.bat deleted file mode 100644 index 3ffa7ad955..0000000000 --- a/adm/templates/inspector.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -rem Use: -rem - first argument specifies version of Visual Studio (vc8, vc9, or vc10), -rem - second argument specifies architecture (win32 or win64), -rem - third argument specifies build mode (Debug or Release) -rem - fourth and next arguments specify loaded tool plugins -rem The arguments are: dfbrowser shapeview vinspector -rem If there are no tool plugins are specified, all plugins will be loaded -rem Default options are: -rem vc8 win32 Release - -rem Setup environment and launch TInspector -call "%~dp0env.bat" %1 %2 %3 - -TInspectorEXE.exe %* - diff --git a/adm/templates/inspector.sh b/adm/templates/inspector.sh deleted file mode 100644 index d79f099d75..0000000000 --- a/adm/templates/inspector.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -aCurrentPath="$PWD" -aScriptPath=${BASH_SOURCE%/*}; if [ -d "${aScriptPath}" ]; then cd "$aScriptPath"; fi; aScriptPath="$PWD"; - -source "${aScriptPath}/env.sh" "$1" - -cd ${aCurrentPath} -TInspectorEXE diff --git a/dox/FILES_HTML.txt b/dox/FILES_HTML.txt index fbfcb40d4c..ebfe027e0a 100644 --- a/dox/FILES_HTML.txt +++ b/dox/FILES_HTML.txt @@ -48,7 +48,6 @@ user_guides/xde/xde.md user_guides/de_wrapper/de_wrapper.md user_guides/ocaf/ocaf.md user_guides/draw_test_harness/draw_test_harness.md -user_guides/inspector/inspector.md user_guides/vis/vis.md specification/specification.md diff --git a/dox/FILES_PDF.txt b/dox/FILES_PDF.txt index e67ee8482f..68bd191766 100644 --- a/dox/FILES_PDF.txt +++ b/dox/FILES_PDF.txt @@ -21,7 +21,6 @@ user_guides/iges/iges.md user_guides/step/step.md user_guides/xde/xde.md user_guides/de_wrapper/de_wrapper.md -user_guides/inspector/inspector.md user_guides/draw_test_harness/draw_test_harness.md contribution/contribution_workflow/contribution_workflow.md diff --git a/dox/samples/novice_guide.md b/dox/samples/novice_guide.md index 09568ee2e4..9818c843a6 100644 --- a/dox/samples/novice_guide.md +++ b/dox/samples/novice_guide.md @@ -62,7 +62,6 @@ Additionally, @ref occt_user_guides__modeling_algos "Modeling Algorithms" are us The **Topology** section of the Overview demonstrates the functions used in 3D operations. Multiple use cases are provided, including different object intersections, modifying and calculations. -Some of these use cases are described in the documentation, such as @ref occt_user_guides__inspector "Inspector" usage. @figure{sample_overview_qt_topology.png,"",240} height=440px diff --git a/dox/user_guides/draw_test_harness/draw_test_harness.md b/dox/user_guides/draw_test_harness/draw_test_harness.md index 4a206cd563..10cc3e30fb 100644 --- a/dox/user_guides/draw_test_harness/draw_test_harness.md +++ b/dox/user_guides/draw_test_harness/draw_test_harness.md @@ -10885,6 +10885,7 @@ mdist This section describes commands that make possible to use Inspector. +Inspector available in https://github.com/Open-Cascade-SAS/Inspector repository. @subsection occt_draw_13_1 tinspector diff --git a/dox/user_guides/inspector/images/3DView.png b/dox/user_guides/inspector/images/3DView.png deleted file mode 100644 index 71c00818e5f14db602fa316addd64d7eb87996c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7068 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 - - - - - - - - - image/svg+xml - - - - - - - - - - - - Single - Clean - - - 3D view - - View - - Multi - - diff --git a/dox/user_guides/inspector/images/3DView_set_orientation.png b/dox/user_guides/inspector/images/3DView_set_orientation.png deleted file mode 100644 index 605ec83b8097f73492cf3748aee3cc70bd58d837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9474 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 diff --git a/dox/user_guides/inspector/images/TStandaloneEXE.png b/dox/user_guides/inspector/images/TStandaloneEXE.png deleted file mode 100644 index 6cdd5c902fc8e2b6f6425ad805e5dcbd07ab9a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35425 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 diff --git a/dox/user_guides/inspector/images/TStandaloneEXE_open.png b/dox/user_guides/inspector/images/TStandaloneEXE_open.png deleted file mode 100644 index 806efe2d754a19b31075cf79460e107d28eab62b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30523 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 diff --git a/dox/user_guides/inspector/images/VStudio_projects.png b/dox/user_guides/inspector/images/VStudio_projects.png deleted file mode 100644 index 1d2f1626ed8a7dc7d42df5c96ab4adb1f0126ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17034 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 o$alA4`axg=2>QGO - - Layer 1 - - - - - - - - - - Tree Navigation - Update - Search - Search - - - - - Property panel - OCAF tree view - Dump View - 3D View - Property panel (custom) - - \ No newline at end of file diff --git a/dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg b/dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg deleted file mode 100644 index 31e886b4cb..0000000000 --- a/dox/user_guides/inspector/images/dfbrowser_selection_in_tree_view.svg +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/dox/user_guides/inspector/images/display_additional_presentation.png b/dox/user_guides/inspector/images/display_additional_presentation.png deleted file mode 100644 index 8b4eda8716084dfcabc666a6891a46bf9da00f94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7589 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

CYz zmt?Or=7Wd#*JaWJz356M{Q>oeqtR|bhtpqOP3@7zcOvoCDG+S7?IFUiOWSPFtrbG9 z>eFZkb~ozpU+YhEJnl&NI2`fQxt-DBEQiO9fI1F=NLlSpZ%BM|kqU&RvI6px=y#{X zcS`%y`;Nenf2Zhvk+g~W3f8k}We&7t@2Y_Xd44j$2*f zuX|}|;YOPB=1QZG09x|T^{fwv3e4#QGNXOCI5f?(qp)FcmRkT8RX8*)pmCQ~75Z81 z{Dm$gy$uxpc1&ZLG!^Pd_CWIdb-sgig5pwwkEAZpBJdg8Me31e^Ht81#L;nSYK72D z^Nar31=JsTScF~n(BxJcJjbcJgOmgyH7Q|Y`zpr~jJE(_V*bU$-8WMoJ31NntVpy{ z$m$&BO~rNHJBAFjg)TBTU9}6sjA=!ckmv)u=y4QRP92HkvDLg^J#RWq69J5LyvX5E zxgD239JiLIO${Sgk|sz;DO!ay72bm@75!0lzy)rS-vJE+3uY(B&35}d%+&A0?kq$6h?mYJ7?>U^9io~N#QjO&QjC=ML=!ua0ohOEx6Vb$S--P%t`B@>)4E_Ro_RbC-d$)K~nH=a5 zfcVFHIJ9Fr@SeV@P*pvLV{ZQ8?4uWXt`fd1k5z2|yRba9nIRSG#tQfrJ>YbQ9VJ6J zQqkcxt+_8u(u?bkjmMu;~gx`P+T38t~@PjxKyjpk(ZJ{xwkT_|0ZbBB)I$vY>LUelmw!BSNw?62WaYV%fI=YPMnddg00sT>lX_J7z9b;- z=8ru%8BIkJQ26ugJhyb01PYHNDo{vtB9}k~W86d#glEl#Aqs%Kg!y_^(DR9-|HIk# zT&c5a0CB$ zYDE7Pl!5({sNQrq4!IY58#rDNHz~kume<$A?}KU^)GvTc$_L+7n+;u)>^T=IXpv3GqZVRHOg@h57e@i zj;DV+;<@J?L`G^-p;6claqTn|5?N9{s#G=-(m`i1g5iPq#yUWpY|1FHO7JCi z6hN(KERXG7ITz_@%N&By<9N@}1Jh+k~M>j5mcu)&D;dtUhL?RA{$ zuWZT%r!$D}lB7<&_Jr$v1TR3I9>N>VgT(hs@Sl^uuz*RaL&xBziy-Tkrl|mpK<9 z>4*C1elnXHq>_{pS~89ddEtTY*w_9}KD{I8eJeXGJKwVdygd)U=QIj_+H!Hgm*}}1 z_s$$Rp%YNOBU_6Ymg(Zq!}t1x2DGmVCy3$30zg z4T4dGrK;ZOxn5Z;xa;K0T(UU==fG+eL3KwQc^?!|8uToQL?z7Fd5bS zBUT?q63+EN>ReBBoIc0c`n>qy=|Ja(n@;ZL3-pVMJkcSi5HfJqsw zvsBIv)y<B=D8I_mPI{!{U2;OuU(x?Y-GhGKtEv*^H>|e0-;fn?FCW{Sk$b=-T!{ zT<2)|T1V5buJx#0*RO;LPT&mBO0kor zc#d(L?c6?q9TNm>my1FRM!EbI)uY5-qTbCVbQ(3NN3GcI1|`*7=Nx^$Xzh`WuA`{j9a-bE&=2=L zAkmEiU7x+8rxL_VIa$}|-8*9EUG(ps z5g^DlguSfJZAsQ=yxGXLuF(F{ zZ~p4I`pX)vWgpj{@v^SVBFNoSbzxtC8VHEpH#x5YnyccnBAVtDZlKA8t^evv#ekYL z4UB{|asiXXEp~ALWS9fxz{ZYl936Ari(w!cbZ}0jpdJ8WFa*L7HdUM}*asvom4Dt| b6K^?xTbO#&>IVFaN~HQ+>scwx;{E>sj?xic diff --git a/dox/user_guides/inspector/images/display_main_presentation.png b/dox/user_guides/inspector/images/display_main_presentation.png deleted file mode 100644 index 63d3079b51bb596749229b8496033bbd565d1021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7587 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 z 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 QbO1SX>fFgpbu+*J1zc(hxBvhE diff --git a/dox/user_guides/inspector/images/messageview_elements.svg b/dox/user_guides/inspector/images/messageview_elements.svg deleted file mode 100644 index 14bc397452..0000000000 --- a/dox/user_guides/inspector/images/messageview_elements.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - Layer 1 - - - - - - - - - - - Message report - tree view - Dump panel - 3D View - Property panel - (custom) - - \ No newline at end of file diff --git a/dox/user_guides/inspector/images/messageview_pop_up_menu.png b/dox/user_guides/inspector/images/messageview_pop_up_menu.png deleted file mode 100644 index 058d4094471e65df92a37d8ba9c92122511f4928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15022 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 ygFzAS%7>A#ew18Z2mUjK2I?uL#8V~0|P7nyh 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 JQ4H)t{vU?i3=aSR diff --git a/dox/user_guides/inspector/images/preferences.png b/dox/user_guides/inspector/images/preferences.png deleted file mode 100644 index 24221fda8b75a5014404a53f618d277389d94637..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6152 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 Z`HN%FWtUXW8z|Hhs3~hIRVZ4%`46sa`ey(D diff --git a/dox/user_guides/inspector/images/property_panel.png b/dox/user_guides/inspector/images/property_panel.png deleted file mode 100644 index 84e1bbf169a65e00c2e391020a1db1c45bf77ee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155383 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 XRsEaVI>3=C00000NkvXXu0mjf8v9jZ diff --git a/dox/user_guides/inspector/images/property_panel_custom_array.png b/dox/user_guides/inspector/images/property_panel_custom_array.png deleted file mode 100644 index 426c5157edba111534dec596f78e585a03ae3063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2776 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 UP3f`Zd^~}^p3&tB9p^iL17f}=E&u=k diff --git a/dox/user_guides/inspector/images/property_panel_custom_item_selection.svg b/dox/user_guides/inspector/images/property_panel_custom_item_selection.svg deleted file mode 100644 index 73d74e2cfa..0000000000 --- a/dox/user_guides/inspector/images/property_panel_custom_item_selection.svg +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/dox/user_guides/inspector/images/property_panel_custom_label.png b/dox/user_guides/inspector/images/property_panel_custom_label.png deleted file mode 100644 index 9b8abedbaf46f0064b5ddbf9bbd3ca796c45c9e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5789 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 diff --git a/dox/user_guides/inspector/images/property_panel_custom_named_data.png b/dox/user_guides/inspector/images/property_panel_custom_named_data.png deleted file mode 100644 index ac5ba1b978accb4c11f914f8aaffe96004f50f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4329 zcmeHLX;c%&w~s3d3R;U6F`!hTAe*322!bHUCQI3ul7MWoFA0P#M5~CP5W`x85G@2s z3IwncAP^MP0MQ^JY+0a@C9H|;h8XhV|Ma}~@qK%r-iNs}ckayGncw}*nR_P3)!Fu_ z>}gp50C3da&e{zC*aMfgiw+%>%G==)VbW?3)Xmlk&`3M8AXWB`5uR#Z- z`r&vxUnl?|-}9~PQT)l_jCqm%GRi6i-Et1@W@kJR-OluIZb+VH1n5+UDV`cj#uZrXt--(YJbB6KNu+yG zYmQUP;WqCl@r>WctrVMB`|XMVn!&fS_dm_TCw&6nVt*J9c8eJCaPUbyPIP)DB8StI z1}jo|w+4@Fb?#>3Yb&Vfx&jkQH#AY-&_>WL*?kBA)EnS>yMje}oO7i8UdUnKUVTp| zVZ3B=M}~a~^cCg^;>zE&>RwnWTtB7ThjT1tYleCMnvivqw5TO4%}sx?pIt%*XF3dZ7*lEb{rOc1P&;qPC1d>_+PBb+{eJsJkZGU`-vB8B8x51CX#27 zT+=1#Mi%?;?hd;_AbN)3G+51r^~rQWf92KmPrV3)`>Qe&&*%weP-q(~O=VL^kDkXm zAelv#T-B-45I}h}D%BQJNEq`14XdQhpG*DxS|)U7VujW$E^eOncqXHuO?MiEzH z^wVM21PbKyj=P&w+Ls?uW@_ceakLat8j=v7y$5h&rkz&_%`Q+@Qpy=UYRo=n9E)#@ zH@?!;uFiHX*Y;zmU+3R${Cy|#dg{$}*#@(kRK|=pDgxZ$@K$asiqJJGG%P_1$5)l( zIxm^>^>n!X9LC4d)2D!aHa2eGH`vfimSD7kIzkpWv&JaPO)3ufbMl<$=OdSm-s^o_ zGkj_9*2)W9&vm445MR!BNAW=&XL*29N@vP@#D^<)mS!eKab%0ZMe7Muz&E%KPYXfXcTXvy% z-d*g<`lHB2l(7CH!!vj>>QBI+W>uwkj;wbDuNPYxZ#ZiFL zSV>we=HG)hbRay&_&M0RW0ziTYI#mUJ*F2Qd2_F?_1N9J{J8UMcFzN0sy1*LPHuv2 zq%20waY2|naOQoP+51HUUri#%Tk883E9%y$=f|%|)@TX26Q@wSn|5)P#>iztsP4i6 zPu@m+N;!iOT^O?z*7sNm?Kf7%$_izPKhRk$ZHUKkWNRIX6uZ<~cB$${YZhnot&=xy zl*fMUv@+dFbWZaieQtgFCe*OLVxFmik&7!W=zF-|;b8S!)`LuZ+{67z3DeC(F*4NZ zh44#*JBtrKe)Lecgl9HIUpvV0oj%TS?nul$*0riN(SmajFM#0Xe$%M-borhHo|+pP zO3>;z`7qmV@Y4Rz@hH!+kN$LjQ^?%B`RJQvfgP$I+SvS_z@ko`BKBl&r-4k~XkzGO|i+mwe`?cnPiX)W+y)UF6AKhrR`;#A#x*gz2 z^6qccajCm!FaAxiQVi*my9|xNgi8-krlAluzxj-XdIw3UGMK= z{1U~fOgnwZ;zE?aLnx6I3y-jSP$eoOzgtNuEJ|^iD32|D9h~P@U#pN+4Kc;h%Dw65 zDJYU9P-G1m)1<4OMwr4YcQ+H!W1yEnpqp};p>7RX-K&_*hNlitD z>A2(8z?voeDVP?c^2u`DNIh-kF(o6yq zur)xnzLggdF=+-J&PnZ}FS%0Oyd!6XBJ306&CcAnYk2`848o)dS(*`?@OIt+JXIKw zePZZTK-{iFWw+0da^d)(E=kuQl`!eiy9?#2!b=cVA=`!<0I2h0Z4S8C*Trv0M*D~h$BBZK?q5sK^qXSKbU`@}9mFP-uNO5Jjmz^gr zNa<>HhrGrgdiVzlszqdSULx_u2V`M518ts?@^dqGca;n2YauB(#GqK&m0_AFnlVu3 zx}+i)?kcZ9T6)}=?lY-{)p)THj~DmBDphpv{D(Vr^LOHI-;SqzO6A=ge%=tLJ((94 z7Pd{nn=inz2|t761G6^Rk;*p%*4e@QxVTT>ZPJgo0} zQZmyRD@*tIr0cGhUMeWMv3)~dMSAs$Op`ZtY=hsqIQ*GGexLYm#Gw<)vzQx75V%Zj zgzzp?cmoXe=8PEBRv-Vis%`ZeIqYx)Sm*hisG1&CRca6CINL#-2hfe?byF&dm7^6* zupT17);fksROwAgZP2a+Dp{mfJ06&w|9XEqa2bO8GmO3?21ce&rlB0D1zwwmO+I0u zX<8U3b$4}K3c_Bhtb4gfF|Eunykc#gR#qd~h&?G5ixZ3$kPEE|ToqDNGwiGf5nr3_ zRR?ae%>Q#Mt!#cOk&-{?r#aO)_2XZsw4dw%v1kf7%_rcRT*%$ia6CBRd?~+xV(M7^ zl8LDqThS)elru#{qYhOKiIOOUS%OxO| z#mpaypqQGfEj?_crt3`82Gu7N-61C;y>N{CUMQ8R#b=DKw?k(RYj3fyBDGo|lZlr^ z5fxIpg{3xbbX-jvXQ)5lNXA5sa7stiFfJqn1BZGIgxfjI)(?dmw8u)>rh&4Hp9yLg zH2xj|_pEy*H-MI`=68Vt6e#&i=EaXyvIPpoeZYiu1m&E)B&;FB4~##Yuj0bHvr9DV zq6g?ElS)Ffz@@ed<;-gQ>RSFw%HOf>5eZnG7h9~OYg?>1kfHjUD3txgMYyA+3O(rF zN4%Gv?VN3 zm|CGYQTc-SKw{81SR!0DOLBK>jhoU{HjXXga)ZLnFsbWvdDEEm{G~AoSY4WEb1c+W zlus(LW~-t@7nf%1Gb-Gr8BOyjLBZnUcB8Q7YgG`~oI1#uOB}TZW;c(9415be4$>}7 zIBCK+6c|jI-$e+~c%|XK2Ws&h_T*x_OicF|B|s=-yq4TWdeC zj){p&W<3E@2_jN7RjL&z?M9VL7xaOCOK6K}4Yjd(u{!082&(-eR5%)fQ z`qZY{Xhn98S)_WPA3=@uf3E*cyx6wAt-g~ZX17BV)BDY&$@n8Z@=vOW4RprWgc&)r zf*}{-7zEk%y*OmOu#OmFqTCAvRKyc?{s9DP4J)J$#ZP^iHi8=fp1H<+u?)V|wv+?7 z(=#*MCck|jlC>Z3y?GB1pl#i@?@rdcll*`^{Ve!{uoiwstSUgeAgE2jp7n>CCR3y3 z9i{+ORu96mWB{U&ANX(SDbdz9O!)~EsAgdj4=Mr#V!!83Uby>*&3A|9^) zsrOTj?P)qvEjPQ98tD4T6Sh5Sk2HEZcbDHB=?)KN%FbN zFv*@@;`3mmv!8?S{A((anxd3B$Oe420DXn7_xx9}NOE%&Gq|$vPN>`c^jy8AA7t$% zJ+lR+F8gR993k5r;B)pvA!&hX`k=bux&46O+UkVvzp#O-4{yKGTbh?GvUB%!HC_8W za`Rt{f5Ps}<)}B}DW!dT8*BrKVOJ8T~kD@10GJI{n?YN|0 zpPgMD<6hghs;-%U95jP>M^*NBtbc>RB{$w>JrsyfTt9}1+mzzkv1sgZ__j^4KW+;F6yaC*IexN{Qj02V8s3{Cw|*aG_*tNXp}J r%WM!K6!6N5R!9OJ0W|&AC)tOqzQhZDb`B!_i2&H!I9oSb1^)J5$HbQ; diff --git a/dox/user_guides/inspector/images/property_panel_custom_simple_type.png b/dox/user_guides/inspector/images/property_panel_custom_simple_type.png deleted file mode 100644 index f9832d6e79ed7a94f6b5305ed6117300f85c4252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1791 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

1eq!-dr-j*w} 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 B(#Ze- diff --git a/dox/user_guides/inspector/images/property_panel_custom_tree_node.png b/dox/user_guides/inspector/images/property_panel_custom_tree_node.png deleted file mode 100644 index a0e6f617e4051bd1382ad221c598a4441585f893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4399 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 diff --git a/dox/user_guides/inspector/images/search.png b/dox/user_guides/inspector/images/search.png deleted file mode 100644 index 9681b7618414551d71ddbc746e9be3c2cf3b5e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33998 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 diff --git a/dox/user_guides/inspector/images/shapeview.png b/dox/user_guides/inspector/images/shapeview.png deleted file mode 100644 index 0c335e472343a8af0841abea5cf6e8ae60a9d53f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63536 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 diff --git a/dox/user_guides/inspector/images/shapeview_elements.svg b/dox/user_guides/inspector/images/shapeview_elements.svg deleted file mode 100644 index 228ee0848e..0000000000 --- a/dox/user_guides/inspector/images/shapeview_elements.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - Layer 1 - - - - - - Topo_DS - Shape view - - 3D view - - Property panel - - \ No newline at end of file diff --git a/dox/user_guides/inspector/images/shapeview_property_panel.png b/dox/user_guides/inspector/images/shapeview_property_panel.png deleted file mode 100644 index 198cdcb2a30aa922b251f684b0ab162a43b3a7c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24606 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 BLFWJf diff --git a/dox/user_guides/inspector/images/shapeview_tree_columns.png b/dox/user_guides/inspector/images/shapeview_tree_columns.png deleted file mode 100644 index 94cf9598435602b6c639db581187905f8d5ab157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19597 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 diff --git a/dox/user_guides/inspector/images/tinspector_elements.svg b/dox/user_guides/inspector/images/tinspector_elements.svg deleted file mode 100644 index e112187b45..0000000000 --- a/dox/user_guides/inspector/images/tinspector_elements.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - Layer 1 - - - - - - - - - - DFBrowser - MessageView - ShapeView - VInspector - - \ No newline at end of file diff --git a/dox/user_guides/inspector/images/treeview_preferences.svg b/dox/user_guides/inspector/images/treeview_preferences.svg deleted file mode 100644 index 5627c577e9..0000000000 --- a/dox/user_guides/inspector/images/treeview_preferences.svg +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - Column_1 - Column_4 - - - Name - - - - - - - - Column_1 - Name - Column_2 - - - - - - - - - - Column_3 - Column_4 - Column_5 - - diff --git a/dox/user_guides/inspector/images/vinspector.png b/dox/user_guides/inspector/images/vinspector.png deleted file mode 100644 index 8f3fbfe308cc60512121a28b27eaa9b644d5d9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21381 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¹vd$8tq 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 L+#N4EgdF+>>j!|_ diff --git a/dox/user_guides/inspector/images/vinspector_elements.svg b/dox/user_guides/inspector/images/vinspector_elements.svg deleted file mode 100644 index 89fd298344..0000000000 --- a/dox/user_guides/inspector/images/vinspector_elements.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - Layer 1 - - - - - - Update - 3D view - - - Presentations tree view - - - Property panel - - - \ No newline at end of file diff --git a/dox/user_guides/inspector/images/vinspector_light_setting.png b/dox/user_guides/inspector/images/vinspector_light_setting.png deleted file mode 100644 index a91e1e8e13c0e3f5252992000c2ec3ba4b6a16a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31964 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

#ya*nVWV*Lqvm8)1o_*o`v}WZkofj>+ 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 bHoSS;WnE94mOLgxKUkaFo0aT6dj9_a?GP*2 diff --git a/dox/user_guides/inspector/images/vinspector_property_panel.png b/dox/user_guides/inspector/images/vinspector_property_panel.png deleted file mode 100644 index 7650dd502744a29ae7ea55c1d61bd01dcdaf6297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36449 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 U*nh74A?ZJ~HT2Y9s9E3pKOy6bc>n+a diff --git a/dox/user_guides/inspector/images/vinspector_tree_columns.png b/dox/user_guides/inspector/images/vinspector_tree_columns.png deleted file mode 100644 index 34617f832421b31da35b0497061d128716bf035c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17567 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 diff --git a/dox/user_guides/inspector/inspector.md b/dox/user_guides/inspector/inspector.md deleted file mode 100644 index 59a0bb38ee..0000000000 --- a/dox/user_guides/inspector/inspector.md +++ /dev/null @@ -1,635 +0,0 @@ -Inspector {#occt_user_guides__inspector} -=============================== - -@tableofcontents - -@section occt_inspector_1 Introduction - -This manual explains how to use the Inspector. - -@subsection occt_inspector_1_1 Overview -Inspector is a Qt-based library that provides functionality to interactively inspect low-level content of the OCAF data model, OCCT viewer and Modeling Data. -This component is aimed to assist the developers of OCCT-based applications to debug the problematic situations that occur in their applications. - -Inspector has a plugin-oriented architecture. The current release contains the following plugins: - -| Plugin | OCCT component | Root class of OCCT investigated component | -| :----- | :----- | :----- | -| @ref occt_inspector_2_2 "DFBrowser"| OCAF | *TDocStd_Application* | -| @ref occt_inspector_2_3 "VInspector"| Visualization | *AIS_InteractiveContext* | -| @ref occt_inspector_2_4 "ShapeView"| Modeling Data | *TopoDS_Shape* | -| @ref occt_inspector_2_5 "MessageView"| Modeling Data | *Message_Report* | - - -Each plugin implements logic of a corresponding OCCT component. - -Each of the listed plugins is embedded in the common framework, thus it is possible to manage, which plugins should be loaded by the Inspector, and to extend their number by implementing a new plugin. - - -@subsection occt_inspector_1_3 Getting started - -There are two launch modes: -1. Launch **TInspectorEXE** executable sample. For more details see @ref occt_inspector_4_1 "TInspectorEXE" section; -2. Launch DRAW, load plugin INSPECTOR, and use *tinspector* command. - For more details, see @ref occt_inspector_4_2 "Launch in DRAW Test Harness" section. - - -**Note**. If you have no Inspector library in your build directory, make sure that OCCT is compiled with *BUILD_Inspector* -option ON. For more details see @ref occt_inspector_5 "Build procedure". - - -@section occt_inspector_2 Inspector Plugins - -@subsection occt_inspector_2_1 Overview - -Inspector consists of the following components: - * buttons to activate the corresponding plugin; - * view area to visualize the plugin content. - -@figure{tinspector_elements.svg,"Plugins placement in Inspector",360} - -@subsection occt_inspector_2_2 DFBrowser Plugin - -@subsubsection occt_inspector_2_2_1 Overview - -@figure{dfbrowser.png, "DFBrowser"} - -This plugin visualizes the content of *TDocStd_Application* in a tree view. It shows application documents, -the hierarchy of *TDF_Labels*, the content of *TDF_Attributes* and interconnection between attributes (e.g. references). -Additionally there is a 3D view to visualize *TopoDS_Shape* elements stored in the document. - -@subsubsection occt_inspector_2_2_2 Elements - -@figure{dfbrowser_elements.svg, "DFBrowser Elements",360} - -OCAF tree view - -Each OCAF element has own tree view item: - -| Type | Tree item | Text | Description | -| :----- | :----- | :----- | :----- | -| *TDocStd_Application* | Application | *TDocStd_Application* | The root of tree view. Its children are documents.| -| *TDocStd_Document* | Document | entry : name | A child of *Application* item. Its children are *Label* and *Attribute* items.
Text view is an entry of the root label and the value of *TDataStd_Name* attribute for the label if it exists. | -| *TDF_Label* | Label | entry : name | A child of a *Document* or another *Label* item. Its children and text view are the same as for Document item. | -| *TDF_Attribute* | Attribute | attribute type [additional information] | A child of a *Label*. It has no children.
Text view is the attribute type *(DynamicType()->Name()* of *TDF_Attribute*) and additional information (a combination of attribute values). | - - -Additional information about TDF_Attributes: - -| Type | Text | -| :----- | :----- | -| *TDocStd_Owner* | [storage format] | -| *TDataStd_AsciiString*,
*TDataStd_Name*,
*TDataStd_Real*,
other *Simple* type attributes | [value] | -| *TDataStd_BooleanList*,
*TDataStd_ExtStringList*,
other *List* attributes | [value_1 ... value_n] | -| *TDataStd_BooleanArray*,
*TDataStd_ByteArray*,
other *Array* type attributes | [value_1 ... value_n] | -| *TDataStd_TreeNode* | [tree node ID ==> Father()->Label()] (if it has a father) or
[tree node ID <== First()->Label()] (if it has NO father)| -| *TDataStd_TreeNode(XDE)* | [XDE tree node ID ==> Father()->Label()] (if it has a father),
[XDE tree Node ID <== label_1, ..., label_n] (if it has NO father)| -| *TNaming_NamedShape* | [shape type : evolution] | -| *TNaming_UsedShapes* | [map extent] | - - -Custom color of items: - -| OCAF element Type | Color | -| :----- | :----- | -| *TDF_Label* | dark green, if the label has *TDataStd_Name* attribute,
light grey if the label is empty (has no attributes on all levels of hierarchy),
black otherwise. | -| *TNaming_NamedShape* | dark gray for *TopAbs_FORWARD* orientation of *TopoDS_Shape*,
gray for *TopAbs_REVERSED* orientation of *TopoDS_Shape*,
black for other orientation. | - - -Context pop-up menu: -| Action | Functionality | -| :----- | :----- | -| Expand | Expands the next two levels under the selected item. | -| Expand All | Expands the whole tree of the selected item. | -| Collapse All | Collapses the whole tree of the selected item. | - -Property Panel - -Property panel is used to display the result of TDF_Attribute::Dump() or TDF_Label::Dump() of the selected tree view item. -The information is shown in one table. - -@figure{property_panel.png,"PropertyPanel",360} - -Property Panel (custom) - -Property panel (custom) is used to display the content of *Label* or *Attribute* tree view items or Search result view. -The information is usually shown in one or several tables. - -*TDF_Attribute* has the following content in the Property Panel: - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDescriptionContent
TDF_Label a table of [entry or attribute name, value]@figure{property_panel_custom_label.png, "",140}
TDocStd_Owner,
Simple type attributes,
List type attributes
a table of [method name, value]@figure{property_panel_custom_simple_type.png, "",140}
TDataStd_BooleanArray,
TDataStd_ByteArray,
other Array type attributes
2 controls:
- a table of [array bound, value],
- a table of [method name, value]
@figure{property_panel_custom_array.png, "",140}
TDataStd_TreeNode2 controls:
- a table of [Tree ID, value] (visible only if Tree ID() != ID() ),
- a tree view of tree nodes starting from *Root()* of the tree node. The current tree node has dark blue text.
@figure{property_panel_custom_tree_node.png, "",140}
TDataStd_NamedDatatab bar of attribute elements, each tab has a table of [name, value]@figure{property_panel_custom_named_data.png, "",140}
TNaming_UsedShapesa table of all shapes handled by the framework@figure{property_panel_custom_tnaming_used_shapes.png, "",140}
TNaming_NamedShape2 controls:
- a table of [method name, value] including CurrentShape/OriginalShape methods result of TNaming_Tools,
- an evolution table.
Tables contain buttons for @ref occt_shape_export "TopoDS_Shape export".
@figure{property_panel_custom_tnaming_named_shape.png, "",140}
TNaming_Naming2 controls:
- a table of TNaming_Name values,
- a table of [method name, value]
@figure{property_panel_custom_tnaming_naming.png, "",140}
- - -Dump view - -@figure{dump_attribute.png, "Dump of TDF_Attribute",200} - -Dump view shows the result of TDF_Attribute::Dump() or TDF_Label::Dump() of the selected tree view item. - -3D view - -3D View visualizes *TopoDS_Shape* elements of OCAF attribute via AIS facilities. - -DFBrowser creates two kinds of presentations depending on the selection place: - - - - - - - - - - - -
KindSource objectVisualization propertiesView
Main presentationTree view item:
*TPrsStd_AISPresentation*,
*TNaming_NamedShape*,
*TNaming_Naming*
Color: a default color for shape type of the current *TopoDS_Shape*.@figure{display_main_presentation.png, "",100}
Additional presentationReferences in Property panelColor: white@figure{display_additional_presentation.png, "",100}
- - - -Tree Navigation - -Tree Navigation shows a path to the item selected in the tree view. -The path is a sequence of label entries and attribute type names. -Each element in the path is selectable - simply click on it to select the corresponding tree view item. - -Navigation control has buttons to go to the previous and the next selected tree view items. - - -Update Button - -Update button synchronizes content of tree view to the current content of OCAF document that could be modified outside. - -Search - -The user can search OCAF element by typing: - * *TDF_Label* entry, - * *TDF_Attribute* name, - * *TDataStd_Name* and *TDataStd_Comment* attributes value. - -@figure{search.png,"Search",360} - -As soon as the user confirms the typed criteria, the Property panel is filled by all satisfied values. -The user can click a value to highlight the corresponding tree view item. By double click the item will be selected. - - -@subsubsection occt_inspector_2_2_3 Elements cooperation - -Tree item selection - -Selection of tree view item updates content of the following controls: - * Navigation line; - * Property Panel; - * 3D View (if it is possible to create an interactive presentation); - * Dump View. - -@figure{dfbrowser_selection_in_tree_view.svg,"",360} - -Property Panel (custom) item selection - -If the property panel (custom) shows content of *TDF_Label*: - * selection of the table row highlights the corresponding item in the tree view, - * double click on the table row selects this item in the tree view. - -If the property panel (custom) shows content of *TDF_Attribute* that has reference to another attribute, selection of this reference: - * highlights the referenced item in the tree view, - * displays additional presentation in the 3D view if it can be created. - -@figure{property_panel_custom_item_selection.svg,"",360} - -Attributes having references: - -| Type | Reference | Additional presentation -| :----- | :----- | :----- | -| *TDF_Reference* | *TDF_Label* | | -| *TDataStd_ReferenceArray*,
*TDataStd_ReferenceList*,
*TNaming_Naming* | One or several *TDF_Label* in a container. | | -| *TDataStd_TreeNode* | *TDF_Label* | | -| *TNaming_NamedShape* | *TDF_Label* in Evolution table | *TopoDS_Shapes* selected in the property panel tables. | -| *TNaming_UsedShapes* | one or several *TNaming_NamedShape* | *TopoDS_Shapes* of the selected *TNaming_NamedShape*. | - - -@subsubsection occt_shape_export TopoDS_Shape export - -Property panel of *TNaming_NamedShape* attribute has controls to export *TopoDS_Shape* to: - * BREP. **Save file** dialog is open to enter the result file name, - * @ref occt_inspector_2_4 "ShapeView" plugin. The dialog for exporting element to ShapeView allows activating this plugin immediately. - - -@subsection occt_inspector_2_3 VInspector Plugin - -@subsubsection occt_inspector_2_3_1 Overview - -@figure{vinspector.png, "VInspector",360} - -This plugin visualizes interactive objects displayed in *AIS_InteractiveContext* in a tree view with computed selection -components for each presentation. It shows the selected elements in the context and allows selecting these elements. - -@subsubsection occt_inspector_2_3_2 Elements - -@figure{vinspector_elements.svg,"VInspector Elements",360} - -Presentations tree view - -This view shows presentations and selection computed on them. Also, the view has columns with information about the state of visualization elements. - -VInspector tree items. - -| Type | Description | -| :----- | :----- | -| *AIS_InteractiveContext* | The root of tree view. Its children are interactive objects obtained by *DisplayedObjects* and *ErasedObjects* methods.| -| *AIS_InteractiveObject* | A child of *AIS_InteractiveContext* item. Its children are *SelectMgr_Selection* obtained by iteration on *CurrentSelection*. | -| *SelectMgr_Selection* | A child of *AIS_InteractiveObject*. Its children are *SelectMgr_SensitiveEntity* obtaining by iteration on *Sensitive*. | -| *SelectMgr_SensitiveEntity* | A child of *SelectMgr_Selection*. Its children are *SelectMgr_SensitiveEntity* obtaining by iteration on *OwnerId*. | -| *SelectBasics_EntityOwner* | A child of *SelectMgr_SensitiveEntity*. It has no children. | - - -Custom color of tree view items: - -| OCAF element Type | Column | What | Color | -| :----- | :----- | :----- | :----- | -| *AIS_InteractiveObject* | 0 | Text | dark gray in *ErasedObjects* list of *AIS_InteractiveContext*,
black otherwise | -| *AIS_InteractiveObject*,
*SelectMgr_SensitiveEntity*,
*SelectBasics_EntityOwner*| 1 | Background | dark blue, if there is a selected owner under the item,
black otherwise | -| *SelectMgr_Selection*,
*SelectMgr_SensitiveEntity*,
*electBasics_EntityOwner* | all | Text | dark gray, if *SelectionState* of *SelectMgr_Selection* is not *SelectMgr_SOS_Activated*,
black otherwise | - - -Context popup menu in tree view: -| Action | Item | Functionality | -| :----- | :----- | :----- | -| Export to ShapeView | *AIS_InteractiveObject* | Exports *TopoDS_Shape* of the *AIS_Interactive* presentation to ShapeView plugin.
It should be *AIS_Shape* presentation and ShapeView plugin should be registered in Inspector
Dialog about exporting element to ShapeView is shown with a possibility to activate this plugin immediately. | -| Show | *AIS_InteractiveObject* | Displays presentation in *AIS_InteractiveContext*. | -| Hide | *AIS_InteractiveObject* | Erases presentation from *AIS_InteractiveContext*. | - -Update - -This button synchronizes the plugin content with the current state of *AIS_InteractiveContext* and updates the presence of items and their current selection. - -@subsubsection occt_inspector_2_3_3 Elements cooperation - -*VInspector* marks the presentations currently selected in *AIS_InteractiveContext* with a blue background in tree items. Use **Update** button to synchronize VInspector selected items state to the context. - -It is also possible to perform selection in the context using "Selection controls" VInspector feature. However, this operation should be performed carefully as -it clears the current selection in *AIS_InteractiveContext*. - -Selection change: -| From | To | Action | Result | -| :----- | :----- | :----- | :----- | -| *AIS_InteractiveContext* | VInspector | Performs selection in *AIS_InteractiveContext*. | Click **Update** button in VInspector and check **Selection** column:
*AIS_InteractiveContext* item contains some selected objects,
the value of some *AIS_InteractiveObject* is filled if they are selected for this presentation or its entity owner. | -| VInspector | *AIS_InteractiveContext* | Activates one of Selection controls and selects one or several elements in the tree view. | The objects become selected in *AIS_InteractiveContext*. | - -@subsubsection occt_inspector_2_3_4 VInspector tree view columns - -Use context pop-up menu on the tree view header to select, which columns should be displayed. -@figure{vinspector_tree_columns.png, "Vinspector tree header context menu",360} - -Use the setting Lights (position, color) in the view. -@figure{vinspector_light_setting.png, "Vinspector light setting",360} - -@subsubsection occt_inspector_2_3_5 VInspector property panel - -Property panel shows the result of AIS_InteractiveContext::Dump() or AIS_InteractiveObject::Dump(). -@figure{vinspector_property_panel.png, "Vinspector property panel",360} - -@subsection occt_inspector_2_4 ShapeView Plugin - -@subsubsection occt_inspector_2_4_1 Overview - -@figure{shapeview.png, "ShapeView",360} - -This plugin visualizes content of *TopoDS_Shape* in a tree view. - -@subsubsection occt_inspector_2_4_2 Property panel - -Property panel shows properties for TopoDS_Shape based on DumpJson. - -@figure{shapeview_property_panel.png, "ShapeView Property panel",360} - -@subsubsection occt_inspector_2_4_3 Elements - -@figure{shapeview_elements.svg,"ShapeView Elements",360} - -TopoDS_Shape View - -The view elements are *TopoDS_Shape* objects. -The shape is exploded into sub-shapes using *TopoDS_Iterator* of the *TopoDS_Shape*. -Children sub-shapes are presented in the view as children of the initial shape. -By iterating recursively through all shapes we obtain a tree view of items shown in the ShapeView. - -The columns of the View show some information about *TopoDS_Shape* of the item. -The first column allows changing the visibility of the item shape in the 3D view. - -Context pop-up menu in tree view: -| Action | Functionality | -| :----- | :----- | -| Load BREP file | Opens the selected file and appends the resulting *TopoDS_Shape* into the tree view. | -| Remove all shape items | Clears tree view. | -| BREP view | Shows the text view with BREP content of the selected item. Creates the BREP file in a temporary directory of the plugin. | -| Close All BREP views | Closes all opened text views. | -| BREP directory | Displays the folder, where temporary BREP files have been stored. | - -@subsubsection occt_inspector_2_4_4 Elements cooperation - -Selection of one or several items in *TopoDS_Shape* View creates its *AIS_Shape* presentation and displays it in the 3D View. - -@subsubsection occt_inspector_2_4_5 ShapeView tree view columns - -Use context pop-up menu on the tree view header to select, which columns should be displayed. -@figure{shapeview_tree_columns.png, "ShapeView tree header context menu",360} - -@subsection occt_inspector_2_5 MessageView Plugin - -MessageView plugin is used to display content of Message_Report. - -@subsubsection occt_inspector_2_5_1 Message report tree view - -Message report tree view shows the content of the Message_Report. - -Context pop-up menu in message report tree view: -| Action | Functionality | -| :----- | :----- | -| Export Report | Exports the report as json file. | -| WallClock Metric statistic | Creates the table that sums the number of calls and the time spent on the functionality inside the value and shows it in Property panel (custom). It's necessary to activate "WallClock metric". | -| Preview children presentations | Displays presentations of children items of selected items if found. | -| Deactivate | Deactivates all types of metrics for the current report. | -| Activate | Appends items to activate report metrics. | -| Clear | Clears message report. | -| Activate metric | Switches active state in report for clicked type of metric. | -| Test metric | Sends several alerts to check metric of message-alert-tool mechanism. | -| Test Message_Messenger | Sends several alerts to check property panel/presentations of messenger-alert-tool mechanism. | -| Test Tree of messages | Sends several alerts to check tree of alerts. | - -@figure{messageview_pop_up_menu.png, "MessageView pop-up menu",360} - -@subsubsection occt_inspector_2_5_2 3D View - -3D View shows the selected item (TopoDS_Shape) in message report tree view. -@figure{messageview_view.png, "MessageView 3D View",360} - -@subsubsection occt_inspector_2_5_3 Dump panel - -Shows Dump() information of the selected item if the item has Dump(). -@figure{messageview_dump_panel.png, "MessageView 3D View",360} - -@subsubsection occt_inspector_2_5_4 Property panel (custom) - -Shows the table for WallClock Metric statistic option. -@figure{messageview_property_panel_custom.png, "MessageView 3D View",360} - -@subsubsection occt_inspector_2_5_5 Elements -@figure{messageview_elements.svg, "MessageView elements",360} - -@section occt_inspector_3 Common controls - -@subsection occt_inspector_3_1 Tree View - -This control shows presentation hierarchy of the investigated OCCT element, e.g. *TDocStd_Application* for DFBrowser, see @ref occt_inspector_1_1 "Overview". -The first column contains the name, other columns are informative. - -The tree view has a context menu with plugin-specific actions. - -@subsubsection occt_inspector_3_1_1 Tree View preferences - -It is possible to define visibility and width of columns. -This option is available in a view that contains more than one column, - e.g. @ref occt_inspector_2_3_4 "VInspector tree view columns" - and @ref occt_inspector_2_4_4 "ShapeView tree view columns". - -@figure{treeview_preferences.svg, "Preferences schema",360} - - -@subsection occt_inspector_3_2 3D View - -@subsubsection occt_inspector_3_2_1 Overview - -@figure{3DView.png, "3D View",360} - -This control for OCCT 3D viewer creates visualization view components and allows performing some user actions in the view. - - -@subsubsection occt_inspector_3_2_2 Elements - -@figure{3DView_elements.svg,"3DView Elements",360} - -3D View contains the following elements: -| Element | Functionality | -| :----- | :----- | -| 3D view | V3d viewer with mouse events processing. | -| Context | Allows choosing another context that should be used in the plugin. The following contexts are available:
**Own** - the context of this view,
**External** - the context of the @ref occt_inspector_4_3 "external application", which initializes the plugin,
**None** - the visualization is not performed at all (useful if the presentation is too complex). | -| Multi/Single | The buttons define what to do with the previously displayed objects:
**Multi** displays new presentations together with already displayed ones,
**Single** removes all previously displayed presentations. | -| Clean | Removes all displayed presentations. | -| Trihedron display | Shows the trihedron. | -| View cube display | Shows the view cube. | -| Fit All | Scene manipulation actions
(Fit All is checkable. If checked(by double click), display/hide of new objects will perform **Fit All** of the scene.) | -| Display Mode | Sets *AIS_Shading* or *AIS_WireFrame* display mode for all presentations. | - -Context popup menu: -| Action | Functionality | -| :----- | :----- | -| Set View Orientation | Shows the list of available *V3d_View* projections. Selection of an item with change the view. | - -@figure{3DView_set_orientation.png,"Set view orientation",360} - -@subsubsection occt_inspector_3_2_3 3D View preferences. -View preferences store the current view orientation. - -@subsection occt_inspector_3_3 Preferences context menu - -@figure{preferences.png,"Plugin preferences",360} - -Context menu contains: -| Element | Functionality | -| :----- | :----- | -| Tree Level Line,
PropertyPanel,
PropertyPanel (custom),
Dump,
View| Names of dock widgets in the active plugin. If the button is checked, dock widget is visible. | -| Store Preferences | Creates ".tinspector.xml" preferences file with the current settings for each plugin.
This file is created in TEMP/TMP directory (by default) or in a user-defined directory. | -| Remove Preferences | Removes preferences file. After the Inspector is restarted, default values will be applied. | - - -The following controls have store/restore preferences: -| Element | Preferences | -| :----- | :----- | -| Geometry| Inspector window size and position.
State of dockable widgets : visibility, position, size.| -| @ref occt_inspector_3_1_1 "Tree View preferences"| Columns visible in the tree view and their width. | -| @ref occt_inspector_3_2_3 "3D View preferences"| 3D view camera direction. | - -@section occt_inspector_4 Getting Started - -@subsection occt_inspector_4_1 TInspectorEXE sample - -This sample allows trying Inspector functionality. - -Use *inspector.bat* script file placed in a binary directory of OCCT to launch it. - -This script accepts the names of plugin's DLL that should be loaded. By default it loads all plugins described above. - - -@figure{TStandaloneEXE.png, "TStandaloneEXE",360} - -Click on the Open button shows the dialog to select a file. -@figure{TStandaloneEXE_open.png, "",360} - -Depending on the active plugin, it is possible to select the following files in the dialog:
-- DFBRowser: OCAF document or STEP files; -- VInspector: BREP files; -- ShapeView: BREP files. - -Click the file name in the proposed directory and enter it manually or using **Browse** button. - -By default, TInspectorEXE opens the following files for plugins: -| Plugin DLL library name | Files | -| :----- | :----- | -| TKDFBrowser | step/screw.step | -| TKVInspector | occ/hammer.brep | -| TKShapeView | occ/face1.brep,
occ/face2.brep | - -These files are found relatively to *CSF_OCCTDataPath*. - -@subsubsection occt_inspector_4_1_1 TInspectorEXE preferences -The application stores recently loaded files. On the application start, the last file is activated. -**Open file** dialog contains recently loaded files. -Selection of a new file updates the container of recently loaded files and rewrites preferences. - -Source code of *TIspectorEXE* is a good sample for @ref occt_inspector_4_3 "using the Inspector in a custom application". - -@subsection occt_inspector_4_2 How to launch the Inspector in DRAW Test Harness - -*TKToolsDraw* plugin provides DRAW commands for Qt tools. Use *INSPECTOR* parameter of @ref occt_draw_1_3_3 "pload" -command to download the commands of this library. It contains *tinspector* command to start Inspector under DRAW. -See more detailed description of the @ref occt_draw_13_1 "tinspector" command. - -The simple code to start Inspector with all plugins loaded: - -~~~~ -pload INSPECTOR -tinspector -~~~~ - -@figure{drawexe_tinspector.png,"tinspector",360} - -This command does the following: -- all available Plugins are presented in the Inspector. These are @ref occt_inspector_2_2 "DFBrowser", @ref occt_inspector_2_3 "VInspector", @ref occt_inspector_2_4 "ShapeView" and @ref occt_inspector_2_5 "MessageView"; -- DFBrowser is the active plugin; -- OCAF tree is empty. - -After this, we should create objects in DRAW and update *tinspector*. -The examples of using Inspector in DRAW can be found in OCCT source directory /tests/tools. - -@subsection occt_inspector_4_3 How to use the Inspector in a custom application - -The example of using the Inspector in a custom application is presented in OCCT qt sample - FuncDemo. -For building qt samples, switch on *BUILD_SAMPLES_QT* variable in @ref build_cmake_conf "Configuration process". - -In general, the following steps should be taken: -* Set dependencies to OCCT and Qt in the application (Header and Link); -* Create an instance of *TInspector_Communicator*; -* Register the plugins of interest in the communicator by DLL library name; -* Initialize the communicator with objects that will be investigated; -* Set visible true for the communicator. - - - -Here is an example of C++ implementation: -~~~~{.cpp} - -#include - -static TInspector_Communicator* MyTCommunicator; - -void CreateInspector() -{ - NCollection_List aParameters; - //... append parameters in the list - - if (!MyTCommunicator) - { - MyTCommunicator = new TInspector_Communicator(); - - MyTCommunicator->RegisterPlugin ("TKDFBrowser"); - MyTCommunicator->RegisterPlugin ("TKVInspector"); - MyTCommunicator->RegisterPlugin ("TKShapeView"); - MyTCommunicator->RegisterPlugin ("TKMessageView"); - - MyTCommunicator->Init (aParameters); - MyTCommunicator->Activate ("TKDFBrowser"); - } - MyTCommunicator->SetVisible (true); -} -~~~~ - -Give one the following objects for a plugin using a container of parameters: - -| Plugin | to be initialized by | -| :----- | :----- | -| *TKDFBrowser* | *TDocStd_Application* | -| *TKVInspector* | *AIS_InteractiveContext* | -| *TKShapeView* | *TopoDS_TShape* | -| *TKMessageView* | *Message_Report* | - - -@section occt_inspector_5 Build procedure - - -@subsection occt_inspector_5_1 Building with CMake within OCCT - -By default the Inspector compilation is off. -To compile it, set the *BUILD_Inspector* flag to "ON". See @ref build_cmake_conf "Configuration process". - -When this option is switched ON, MS Visual Studio project has an additional tree of folders: - -@figure{VStudio_projects.png,"Inspector packages in MS Visual Studio",160} - - -@section occt_inspector_6 Sources and packaging - -OCCT sources are extended by the /tools directory. - -Distribution of plugin packages : -| Source packages | Plugin | -| :----- | :----- | -| *DFBrowser*,
*DFBrowserPane*,
*DFBrowserPaneXDE*,
*TKDFBrowser* | DFBrowser | -| *VInspector*,
*TKVInspector* | VInspector | -| *ShapeView*,
*TKShapeView* | ShapeView | -| *MessageView*,
*TKMessageView* | MessageView | - -Other packages: -| Source packages| Used in | -| :----- | :----- | -| *TInspectorAPI*,
*TKInspectorAPI* | Interface for connection to plugin. | -| *ViewControl*,
*TKTreeModel* | Classes for property view, table, table model. | -| *TreeModel*,
*TKTreeView* | Items-oriented model to simplify work with GUI tree control. | -| *View*,
*TKView* | 3D View component. | -| *TInspector*,
*TKTInspector* | Inspector window, where plugins are placed. | -| *ToolsDraw*,
*TKToolsDraw* | Plugin for DRAW to start Inspector. | - - -In MSVC studio, a separate folder contains Inspector projects. - -@section occt_inspector_7 Glossary -* **Component** -- a part of OCCT , e.g. OCAF, VISUALIZATION, MODELING and others. -* **Plugin** -- a library that is loaded in some executable/library. Here, the plugins are: - * DFBrowser, - * ShapeView, - * VInspector. diff --git a/dox/user_guides/user_guides.md b/dox/user_guides/user_guides.md index 76223a876d..80a9391674 100644 --- a/dox/user_guides/user_guides.md +++ b/dox/user_guides/user_guides.md @@ -16,4 +16,3 @@ OCCT User Guides are organized by OCCT modules: * @subpage occt_user_guides__de_wrapper "Data Exchange Wrapper (DE Wrapper)" * @subpage occt_user_guides__ocaf "Open CASCADE Application Framework (OCAF)" * @subpage occt_user_guides__test_harness "DRAW Test Harness" -* @subpage occt_user_guides__inspector "Inspector" diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt deleted file mode 100644 index f6d8d1612d..0000000000 --- a/tools/CMakeLists.txt +++ /dev/null @@ -1,405 +0,0 @@ -# Caution! Be careful, when increase minimal cmake version: -# using of newer version may leads (by default) to applying -# of some new policies. It may break compilation. -# For canceling of applying new policies use: -# cmake_policy(PUSH) before `cmake_minimum_required` -# and cmake_policy(POP) after. -cmake_minimum_required (VERSION 3.1 FATAL_ERROR) - -set (ADDITIONAL_INLCUDE_DIR_DESCR "Additional directory to be added in the projects include section") -if (NOT DEFINED ADDITIONAL_INLCUDE_DIR) - set (ADDITIONAL_INLCUDE_DIR "" CACHE PATH ${ADDITIONAL_INLCUDE_DIR_DESCR}) - get_filename_component (ADDITIONAL_INLCUDE_DIR "${ADDITIONAL_INLCUDE_DIR}" ABSOLUTE) -else() - file (TO_CMAKE_PATH "${ADDITIONAL_INLCUDE_DIR}" ADDITIONAL_INLCUDE_DIR) - set (ADDITIONAL_INLCUDE_DIR "${ADDITIONAL_INLCUDE_DIR}" CACHE PATH "${ADDITIONAL_INLCUDE_DIR_DESCR}" FORCE) -endif() - -set (ADDITIONAL_DLL_DIR_DESCR "Additional directories that should be included into PATH") -if (NOT DEFINED ADDITIONAL_DLL_DIR) - set (ADDITIONAL_DLL_DIR "" CACHE PATH ${ADDITIONAL_DLL_DIR_DESCR}) - get_filename_component (ADDITIONAL_DLL_DIR "${ADDITIONAL_DLL_DIR}" ABSOLUTE) -else() - file (TO_CMAKE_PATH "${ADDITIONAL_DLL_DIR}" ADDITIONAL_DLL_DIR) - set (ADDITIONAL_DLL_DIR "${ADDITIONAL_DLL_DIR}" CACHE PATH "${ADDITIONAL_DLL_DIR_DESCR}" FORCE) -endif() - -set (CURRENT_DIR "${CMAKE_SOURCE_DIR}") -set (CMAKE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/.." CACHE INTERNAL "" FORCE) -set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/adm/cmake") - -set (CMAKE_SUPPRESS_REGENERATION TRUE) - -set (CMAKE_CONFIGURATION_TYPES Release Debug RelWithDebInfo CACHE INTERNAL "" FORCE) - -# include cmake file -macro (OCCT_INCLUDE_CMAKE_FILE BEING_INCLUDED_FILE) - include (${CMAKE_SOURCE_DIR}/${BEING_INCLUDED_FILE}.cmake) -endmacro() - -macro (OCCT_INCLUDE_3RDPARTY_PRODUCT USE_PRODUCT PRODUCT_CONFIG_FILE) - if (${USE_PRODUCT}) - OCCT_INCLUDE_CMAKE_FILE ("${PRODUCT_CONFIG_FILE}") - endif (${USE_PRODUCT}) -endmacro() - -# include variable description -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/vardescr") - -# set type of OCCT libraries -if (NOT BUILD_LIBRARY_TYPE) - set (BUILD_LIBRARY_TYPE "Shared" CACHE STRING "${BUILD_LIBRARY_TYPE_DESCR}" FORCE) - SET_PROPERTY(CACHE BUILD_LIBRARY_TYPE PROPERTY STRINGS Shared Static) -endif() - -if ("${BUILD_LIBRARY_TYPE}" STREQUAL "Shared") - set (BUILD_SHARED_LIBS ON) - - if (NOT DEFINED BUILD_SHARED_LIBRARY_NAME_POSTFIX) - set (BUILD_SHARED_LIBRARY_NAME_POSTFIX "" CACHE STRING "${BUILD_SHARED_LIBRARY_NAME_POSTFIX_DESCR}" FORCE) - endif() -else() - unset (BUILD_SHARED_LIBS) - unset (BUILD_SHARED_LIBRARY_NAME_POSTFIX) -endif() - -# the name of the project -project (Inspector) - -if (WIN32) - add_definitions(-DUNICODE) - add_definitions(-D_UNICODE) -endif() - -# include occt macros -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros") - -# Solution folder property -set_property (GLOBAL PROPERTY USE_FOLDERS ON) - -# a single-configuration generator like the Makefile generator defines CMAKE_BUILD_TYPE variable -# check this variable and set if it's required -if (DEFINED CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE) # single-configuration generator. - set (CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) -endif() - -if (BUILD_WITH_DEBUG) - set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$:OCCT_DEBUG>) -endif() - -# install dir of the project -if (NOT DEFINED INSTALL_DIR) - # set default install directory for Windows - if (WIN32 AND NOT DEFINED CMAKE_INSTALL_PREFIX) - set (CMAKE_INSTALL_PREFIX "C:/opencascade-${OCC_VERSION_STRING_EXT}/inspector") - endif() - set (INSTALL_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "${INSTALL_DIR_DESCR}") -else() - file (TO_CMAKE_PATH "${INSTALL_DIR}" INSTALL_DIR) - set (INSTALL_DIR "${INSTALL_DIR}" CACHE PATH "${INSTALL_DIR_DESCR}" FORCE) -endif() - -# choose a variant of the layout of the install paths -if (NOT INSTALL_DIR_LAYOUT) - if (WIN32) - set (INSTALL_DIR_LAYOUT "Windows" CACHE STRING "${INSTALL_DIR_LAYOUT_DESCR}" FORCE) - else() - set (INSTALL_DIR_LAYOUT "Unix" CACHE STRING "${INSTALL_DIR_LAYOUT_DESCR}" FORCE) - endif() - SET_PROPERTY(CACHE INSTALL_DIR_LAYOUT PROPERTY STRINGS Windows Unix) -endif() - -# check INSTALL_DIR_LAYOUT changes and update INSTALL_DIR_* paths if necessary -if (NOT DEFINED INSTALL_DIR_LAYOUT_PREV) - set (INSTALL_DIR_LAYOUT_PREV "${INSTALL_DIR_LAYOUT}" CACHE INTERNAL "" FORCE) -elseif (NOT "${INSTALL_DIR_LAYOUT_PREV}" STREQUAL "${INSTALL_DIR_LAYOUT}") - set (INSTALL_DIR_LAYOUT_PREV "${INSTALL_DIR_LAYOUT}" CACHE INTERNAL "" FORCE) - # The structure of install folder should be reset due to changed layout - OCCT_CHECK_AND_UNSET_INSTALL_DIR_SUBDIRS () - - # Unset INSTALL_DIR_WITH_VERSION on windows - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Windows") - OCCT_CHECK_AND_UNSET (INSTALL_DIR_WITH_VERSION) - else() - if (NOT DEFINED INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_WITH_VERSION OFF CACHE BOOL "${INSTALL_DIR_WITH_VERSION_DESCR}") - endif() - endif() -endif() - -# check CMAKE_INSTALL_PREFIX changes and update INSTALL_DIR if necessary -if (NOT DEFINED CMAKE_INSTALL_PREFIX_PREV) - set (CMAKE_INSTALL_PREFIX_PREV "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "" FORCE) -elseif (NOT "${CMAKE_INSTALL_PREFIX_PREV}" STREQUAL "${CMAKE_INSTALL_PREFIX}") - # CMAKE_INSTALL_PREFIX has been changed at previous step - set (CMAKE_INSTALL_PREFIX_PREV "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "" FORCE) - - # INSTALL_DIR is required to be updated - set (INSTALL_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "${INSTALL_DIR_DESCR}" FORCE) -endif() - -# check INSTALL_DIR changes and update CMAKE_INSTALL_PREFIX if necessary -if (NOT DEFINED INSTALL_DIR_PREV) - set (INSTALL_DIR_PREV "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) -elseif (NOT "${INSTALL_DIR_PREV}" STREQUAL "${INSTALL_DIR}") - # INSTALL_DIR has been changed at previous step - set (INSTALL_DIR_PREV "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) - - # sync CMAKE_INSTALL_PREFIX with INSTALL_DIR - set (CMAKE_INSTALL_PREFIX "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) - - # set CMAKE_INSTALL_PREFIX_PREV to avoid the reset of structure of the install folder - set (CMAKE_INSTALL_PREFIX_PREV "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) -endif() - -if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - if (NOT DEFINED INSTALL_DIR_WITH_VERSION_PREV) - set (INSTALL_DIR_WITH_VERSION_PREV "${INSTALL_DIR_WITH_VERSION}" CACHE INTERNAL "" FORCE) - elseif (NOT "${INSTALL_DIR_WITH_VERSION_PREV}" STREQUAL "${INSTALL_DIR_WITH_VERSION}") - # INSTALL_DIR_WITH_VERSION has been changed at previous step - set (INSTALL_DIR_WITH_VERSION_PREV "${INSTALL_DIR_WITH_VERSION}" CACHE INTERNAL "" FORCE) - - OCCT_CHECK_AND_UNSET_INSTALL_DIR_SUBDIRS () - endif() -endif() - -# hide CMAKE_INSTALL_PREFIX from a user -set (CMAKE_INSTALL_PREFIX "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) - -set (BIN_LETTER "") -if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - set (BIN_LETTER "d") -elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") - set (BIN_LETTER "i") -endif() - -# Get all used variables: OS_WITH_BIT, COMPILER -OCCT_MAKE_OS_WITH_BITNESS() -OCCT_MAKE_COMPILER_SHORT_NAME() - -# do not define INSTALL_DIR_BIN for win. -# Leave library structure for win: /win64/vc10/bin(d) -if (NOT DEFINED INSTALL_DIR_BIN) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_BIN "bin" CACHE PATH "${INSTALL_DIR_BIN_DESCR}") - else() - set (INSTALL_DIR_BIN "${OS_WITH_BIT}/${COMPILER}/bin" CACHE PATH "${INSTALL_DIR_BIN_DESCR}") - endif() -endif() - -# define folder containing all shell/batch scripts -if (NOT DEFINED INSTALL_DIR_SCRIPT) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_SCRIPT "${INSTALL_DIR_BIN}" CACHE PATH "${INSTALL_DIR_SCRIPT_DESCR}") - else() - set (INSTALL_DIR_SCRIPT "." CACHE PATH "${INSTALL_DIR_SCRIPT_DESCR}") - endif() -endif() - -# place the libraries to /lib folder for unix and leave old structure for windows -if (NOT DEFINED INSTALL_DIR_LIB) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_LIB "lib" CACHE PATH "${INSTALL_DIR_LIB_DESCR}") - else() - set (INSTALL_DIR_LIB "${OS_WITH_BIT}/${COMPILER}/lib" CACHE PATH "${INSTALL_DIR_LIB_DESCR}") - endif() -endif() - -# OCCT headers: /inc for windows, -# /include/opencascade-7.0.0 for unix -if (NOT DEFINED INSTALL_DIR_INCLUDE) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_INCLUDE "include/opencascade" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_INCLUDE "include/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_INCLUDE "inc" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}") - endif() -endif() - -# OCCT resources: /src for windows, -# /share/opencascade-7.0.0/resources for unix -if (NOT DEFINED INSTALL_DIR_RESOURCE) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_RESOURCE "share/opencascade/resources" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_RESOURCE "share/opencascade-${OCC_VERSION_STRING_EXT}/resources" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_RESOURCE "src" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}") - endif() -endif() - -# OCCT data -if (NOT DEFINED INSTALL_DIR_DATA) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_DATA "share/opencascade/data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_DATA "share/opencascade-${OCC_VERSION_STRING_EXT}/data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_DATA "data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}") - endif() -endif() - -# include original list of definitions and flags -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_defs_flags") - -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/3rdparty_macro") - -if (NOT DEFINED 3RDPARTY_DIR) - set (3RDPARTY_DIR "" CACHE PATH ${3RDPARTY_DIR_DESCR}) - get_filename_component (3RDPARTY_DIR "${3RDPARTY_DIR}" ABSOLUTE) -else() - file (TO_CMAKE_PATH "${3RDPARTY_DIR}" 3RDPARTY_DIR) - set (3RDPARTY_DIR "${3RDPARTY_DIR}" CACHE PATH "${3RDPARTY_DIR_DESCR}" FORCE) -endif() - -find_package(OpenCASCADE QUIET PATHS "${OpenCASCADE_DIR}" "${OpenCASCADE_INSTALL_PREFIX}" NO_DEFAULT_PATH) -# include OCCT headers -include_directories ("${OpenCASCADE_INCLUDE_DIR}") - -if (NOT OpenCASCADE_FOUND) - message (FATAL_ERROR "could not find OpenCASCADE, please set OpenCASCADE_DIR variable" ) -else() - set (OpenCASCADE_DIR "${OpenCASCADE_INSTALL_PREFIX}" CACHE PATH "OpenCASCADE directory" FORCE) - message (STATUS "Using OpenCASCADE from \"${OpenCASCADE_DIR}\"" ) -endif() - -set (USE_TCL "${OpenCASCADE_WITH_TCL}") -set (USE_FREETYPE "${OpenCASCADE_WITH_FREETYPE}") -set (USE_FREEIMAGE "${OpenCASCADE_WITH_FREEIMAGE}") -set (USE_GL2PS "${OpenCASCADE_WITH_GL2PS}") -set (USE_TBB "${OpenCASCADE_WITH_TBB}") -set (USE_VTK "${OpenCASCADE_WITH_VTK}") -set (USE_FFMPEG "${OpenCASCADE_WITH_FFMPEG}") -set (USE_GLES2 "${OpenCASCADE_WITH_GLES2}") -set (USE_GLX "${OpenCASCADE_WITH_GLX}") - - -# define CSF variable -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_csf") - -# custom definitions (CMakeConfig of OCCT) -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_TCL "adm/cmake/tcl") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_FREETYPE "adm/cmake/freetype") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_FREEIMAGE "adm/cmake/freeimage") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_GL2PS "adm/cmake/gl2ps") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_TBB "adm/cmake/tbb") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_VTK "adm/cmake/vtk") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_FFMPEG "adm/cmake/ffmpeg") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_GLES2 "adm/cmake/egl") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_GLES2 "adm/cmake/gles2") -OCCT_INCLUDE_3RDPARTY_PRODUCT (USE_GLX "adm/cmake/glx") - - -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt") -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros") - -#include (${CMAKE_SOURCE_DIR}/adm/cmake/3rdparty.cmake) - -set (3RDPARTY_DLL_DEB_PATH "${3RDPARTY_DLL_PATH}") - -# build directories -if (SINGLE_GENERATOR) - set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/lib${BIN_LETTER}") - set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin${BIN_LETTER}") - set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/lib${BIN_LETTER}") - if (WIN32) - set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin${BIN_LETTER}") - endif() -endif() - -set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/lib") -set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin") -set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/lib") - -set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/libi") -set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bini") -set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/libi") - -set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/libd") -set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bind") -set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/libd") - -if (WIN32) - set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin") - set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bini") - set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bind") -endif() - -# OCCT tools -# include original list of tools -# list _TOOLKITS is created foreach tool and contains its toolkits -# list will contain all tools -OCCT_MODULES_AND_TOOLKITS (TOOLS "TOOL_TOOLKITS" OCCT_TOOLS) -foreach (OCCT_TOOL ${OCCT_TOOLS}) - list (APPEND BUILD_TOOL_TOOLKITS ${${OCCT_TOOL}_TOOL_TOOLKITS}) -endforeach() - -# collect all the headers to /inc/inspector folder - -# Ensure the include directory exists -file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}/inspector") - -string(TIMESTAMP CURRENT_TIME "%H:%M:%S") -message (STATUS "\nInfo: \(${CURRENT_TIME}\) Start collecting all OCCT tool header files into ${CMAKE_BINARY_DIR}/inc/inspector ...") -COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOL_TOOLKITS}" "tools" "${INSTALL_DIR_INCLUDE}/inspector") - -# include /inc -include_directories (${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}) - -include_directories (${ADDITIONAL_INLCUDE_DIR}) - -if (3RDPARTY_INCLUDE_DIRS) - list (REMOVE_DUPLICATES 3RDPARTY_INCLUDE_DIRS) - string (REGEX REPLACE ";" "\n\t" 3RDPARTY_INCLUDE_DIRS_WITH_ENDS "${3RDPARTY_INCLUDE_DIRS}") - message (STATUS "Info: The directories of 3rdparty headers: \n\t${3RDPARTY_INCLUDE_DIRS_WITH_ENDS}") - include_directories (${3RDPARTY_INCLUDE_DIRS}) -endif() - -if (3RDPARTY_LIBRARY_DIRS) - list (REMOVE_DUPLICATES 3RDPARTY_LIBRARY_DIRS) - string (REGEX REPLACE ";" "\n\t" 3RDPARTY_LIBRARY_DIRS_WITH_ENDS "${3RDPARTY_LIBRARY_DIRS}") - message (STATUS "Info: The directories of 3rdparty libraries: \n\t${3RDPARTY_LIBRARY_DIRS_WITH_ENDS}") - link_directories (${3RDPARTY_LIBRARY_DIRS}) -endif() - -# include patched toolkit projects or original ones -if (BUILD_TOOL_TOOLKITS) - foreach (BUILD_TOOL_TOOLKIT ${BUILD_TOOL_TOOLKITS}) - OCCT_ADD_SUBDIRECTORY ("tools/${BUILD_TOOL_TOOLKIT}") - endforeach() -endif() - -message (STATUS "Info: \(${CURRENT_TIME}\) OCCT toolkits processed") - -OCCT_MODULES_AND_TOOLKITS (SAMPLES "SAMPLES_TOOLKITS" OCCT_SAMPLES) - -# patch TInspectorEXE -if (MSVC AND 3RDPARTY_DLL_DIRS) - list (REMOVE_DUPLICATES 3RDPARTY_DLL_DIRS) - set (3RDPARTY_DLL_DIRS_FOR_PATH "") - - foreach (3RDPARTY_DLL_DIR ${3RDPARTY_DLL_DIRS}) - set (3RDPARTY_DLL_DIRS_FOR_PATH "${3RDPARTY_DLL_DIRS_FOR_PATH};${3RDPARTY_DLL_DIR}") - endforeach() - - if (ADDITIONAL_DLL_DIR) - foreach (3RDPARTY_DLL_DIR ${ADDITIONAL_DLL_DIR}) - set (3RDPARTY_DLL_DIRS_FOR_PATH "${3RDPARTY_DLL_DIRS_FOR_PATH};${3RDPARTY_DLL_DIR}") - endforeach() - endif (ADDITIONAL_DLL_DIR) - - OCCT_MAKE_COMPILER_BITNESS() - set (X_COMPILER_BITNESS "x64") - if ("${COMPILER_BITNESS}" STREQUAL "32") - set (X_COMPILER_BITNESS "Win32") - endif() - - # patch TInspectorEXE - OCCT_CONFIGURE ("adm/templates/TInspectorEXE.vcxproj.user.in" "${CMAKE_BINARY_DIR}/TInspectorEXE/TInspectorEXE.vcxproj.user") -endif() - -message (STATUS "Info: \(${CURRENT_TIME}\) Inspector configuration files prepared") diff --git a/tools/Convert/Convert_Tools.cxx b/tools/Convert/Convert_Tools.cxx deleted file mode 100644 index 6d7658f9d3..0000000000 --- a/tools/Convert/Convert_Tools.cxx +++ /dev/null @@ -1,294 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : ReadShape -// purpose : -// ======================================================================= -TopoDS_Shape Convert_Tools::ReadShape(const TCollection_AsciiString& theFileName) -{ - TopoDS_Shape aShape; - - BRep_Builder aBuilder; - BRepTools::Read(aShape, theFileName.ToCString(), aBuilder); - return aShape; -} - -//======================================================================= -// function : ConvertStreamToPresentations -// purpose : -//======================================================================= -void Convert_Tools::ConvertStreamToPresentations( - const Standard_SStream& theSStream, - const Standard_Integer theStartPos, - const Standard_Integer /*theLastPos*/, - NCollection_List& thePresentations) -{ - int aStartPos = theStartPos; - - gp_XYZ aPoint; - if (aPoint.InitFromJson(theSStream, aStartPos)) - { - thePresentations.Append(new Convert_TransientShape(BRepBuilderAPI_MakeVertex(aPoint))); - return; - } - - gp_Pnt aPnt; - if (aPnt.InitFromJson(theSStream, aStartPos)) - { - thePresentations.Append(new Convert_TransientShape(BRepBuilderAPI_MakeVertex(aPnt))); - return; - } - - gp_Dir aDir; - if (aDir.InitFromJson(theSStream, aStartPos)) - { - gp_Lin aLin(gp::Origin(), aDir); - Handle(Geom_Line) aGeomLine = new Geom_Line(aLin); - CreatePresentation(aGeomLine, thePresentations); - return; - } - - gp_Ax2 anAx2; - if (anAx2.InitFromJson(theSStream, aStartPos)) - { - Handle(Geom_Plane) aGeomPlane = new Geom_Plane(gp_Ax3(anAx2)); - CreatePresentation(aGeomPlane, thePresentations); - return; - } - - gp_Ax3 anAx3; // should be after gp_Ax2 - if (anAx3.InitFromJson(theSStream, aStartPos)) - { - Handle(Geom_Plane) aGeomPlane = new Geom_Plane(anAx3); - CreatePresentation(aGeomPlane, thePresentations); - return; - } - - // should be after gp_Ax3 - gp_Ax1 anAxis; - if (anAxis.InitFromJson(theSStream, aStartPos)) - { - thePresentations.Append(new Convert_TransientShape( - BRepBuilderAPI_MakeEdge(anAxis.Location(), - anAxis.Location().Coord() + anAxis.Direction().XYZ()))); - return; - } - - gp_Trsf aTrsf; - if (aTrsf.InitFromJson(theSStream, aStartPos)) - { - CreatePresentation(aTrsf, thePresentations); - return; - } - - Bnd_Box aBox; - if (aBox.InitFromJson(theSStream, aStartPos)) - { - TopoDS_Shape aShape; - if (Convert_Tools::CreateShape(aBox, aShape)) - thePresentations.Append(new Convert_TransientShape(aShape)); - return; - } - - Select3D_BndBox3d aSelectBndBox; - if (aSelectBndBox.InitFromJson(theSStream, aStartPos)) - { - TopoDS_Shape aShape; - - gp_Pnt aPntMin = gp_Pnt(aSelectBndBox.CornerMin().x(), - aSelectBndBox.CornerMin().y(), - aSelectBndBox.CornerMin().z()); - gp_Pnt aPntMax = gp_Pnt(aSelectBndBox.CornerMax().x(), - aSelectBndBox.CornerMax().y(), - aSelectBndBox.CornerMax().z()); - if (CreateBoxShape(aPntMin, aPntMax, aShape)) - thePresentations.Append(new Convert_TransientShape(aShape)); - return; - } -} - -//======================================================================= -// function : ConvertStreamToColor -// purpose : -//======================================================================= -Standard_Boolean Convert_Tools::ConvertStreamToColor(const Standard_SStream& theSStream, - Quantity_Color& theColor) -{ - Standard_Integer aStartPos = 1; - Quantity_ColorRGBA aColorRGBA; - if (aColorRGBA.InitFromJson(theSStream, aStartPos)) - { - theColor = aColorRGBA.GetRGB(); - return Standard_True; - } - - Quantity_Color aColor; - if (aColor.InitFromJson(theSStream, aStartPos)) - { - theColor = aColor; - return Standard_True; - } - - return Standard_False; -} - -//======================================================================= -// function : CreateShape -// purpose : -//======================================================================= -Standard_Boolean Convert_Tools::CreateShape(const Bnd_Box& theBoundingBox, TopoDS_Shape& theShape) -{ - if (theBoundingBox.IsVoid() || theBoundingBox.IsWhole()) - return Standard_False; - - Standard_Real aXmin, anYmin, aZmin, aXmax, anYmax, aZmax; - theBoundingBox.Get(aXmin, anYmin, aZmin, aXmax, anYmax, aZmax); - - gp_Pnt aPntMin = gp_Pnt(aXmin, anYmin, aZmin); - gp_Pnt aPntMax = gp_Pnt(aXmax, anYmax, aZmax); - - return CreateBoxShape(aPntMin, aPntMax, theShape); -} - -//======================================================================= -// function : CreateShape -// purpose : -//======================================================================= -Standard_Boolean Convert_Tools::CreateShape(const Bnd_OBB& theBoundingBox, TopoDS_Shape& theShape) -{ - if (theBoundingBox.IsVoid()) - return Standard_False; - - TColgp_Array1OfPnt anArrPnts(0, 8); - theBoundingBox.GetVertex(&anArrPnts(0)); - - BRep_Builder aBuilder; - TopoDS_Compound aCompound; - aBuilder.MakeCompound(aCompound); - - aBuilder.Add(aCompound, - BRepBuilderAPI_MakeEdge(gp_Pnt(anArrPnts.Value(0)), gp_Pnt(anArrPnts.Value(1)))); - aBuilder.Add(aCompound, - BRepBuilderAPI_MakeEdge(gp_Pnt(anArrPnts.Value(0)), gp_Pnt(anArrPnts.Value(2)))); - aBuilder.Add(aCompound, - BRepBuilderAPI_MakeEdge(gp_Pnt(anArrPnts.Value(1)), gp_Pnt(anArrPnts.Value(3)))); - aBuilder.Add(aCompound, - BRepBuilderAPI_MakeEdge(gp_Pnt(anArrPnts.Value(2)), gp_Pnt(anArrPnts.Value(3)))); - - theShape = aCompound; - return Standard_True; -} - -//======================================================================= -// function : CreateBoxShape -// purpose : -//======================================================================= -Standard_Boolean Convert_Tools::CreateBoxShape(const gp_Pnt& thePntMin, - const gp_Pnt& thePntMax, - TopoDS_Shape& theShape) -{ - BRepPreviewAPI_MakeBox aMakeBox; - aMakeBox.Init(thePntMin, thePntMax); - theShape = aMakeBox.Shape(); - - return Standard_True; -} - -//======================================================================= -// function : CreatePresentation -// purpose : -//======================================================================= -void Convert_Tools::CreatePresentation( - const Handle(Geom_Line)& theLine, - NCollection_List& thePresentations) -{ - Handle(AIS_Line) aLinePrs = new AIS_Line(theLine); - aLinePrs->SetColor(Quantity_NOC_TOMATO); - thePresentations.Append(aLinePrs); -} - -//======================================================================= -// function : CreatePresentation -// purpose : -//======================================================================= -void Convert_Tools::CreatePresentation( - const Handle(Geom_Plane)& thePlane, - NCollection_List& thePresentations) -{ - Handle(AIS_Plane) aPlanePrs = new AIS_Plane(thePlane); - - aPlanePrs->Attributes()->SetPlaneAspect(new Prs3d_PlaneAspect()); - Handle(Prs3d_PlaneAspect) aPlaneAspect = aPlanePrs->Attributes()->PlaneAspect(); - aPlaneAspect->SetPlaneLength(100, 100); - aPlaneAspect->SetDisplayCenterArrow(Standard_True); - aPlaneAspect->SetDisplayEdgesArrows(Standard_True); - aPlaneAspect->SetArrowsSize(100); - aPlaneAspect->SetArrowsLength(100); - aPlaneAspect->SetDisplayCenterArrow(Standard_True); - aPlaneAspect->SetDisplayEdges(Standard_True); - - aPlanePrs->SetColor(Quantity_NOC_WHITE); - aPlanePrs->SetTransparency(0); - - thePresentations.Append(aPlanePrs); -} - -//======================================================================= -// function : CreatePresentation -// purpose : -//======================================================================= -void Convert_Tools::CreatePresentation( - const gp_Trsf& theTrsf, - NCollection_List& thePresentations) -{ - Bnd_Box aBox(gp_Pnt(), gp_Pnt(10., 10., 10)); - - TopoDS_Shape aBoxShape; - if (!Convert_Tools::CreateShape(aBox, aBoxShape)) - return; - - Handle(AIS_Shape) aSourcePrs = new AIS_Shape(aBoxShape); - aSourcePrs->Attributes()->SetAutoTriangulation(Standard_False); - aSourcePrs->SetColor(Quantity_NOC_WHITE); - aSourcePrs->SetTransparency(0.5); - thePresentations.Append(aSourcePrs); - - Handle(AIS_Shape) aTransformedPrs = new AIS_Shape(aBoxShape); - aTransformedPrs->Attributes()->SetAutoTriangulation(Standard_False); - aTransformedPrs->SetColor(Quantity_NOC_TOMATO); - aTransformedPrs->SetTransparency(0.5); - aTransformedPrs->SetLocalTransformation(theTrsf); - thePresentations.Append(aTransformedPrs); -} diff --git a/tools/Convert/Convert_Tools.hxx b/tools/Convert/Convert_Tools.hxx deleted file mode 100644 index b809de733d..0000000000 --- a/tools/Convert/Convert_Tools.hxx +++ /dev/null @@ -1,113 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef Convert_Tools_H -#define Convert_Tools_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -class Geom_Line; -class Geom_Plane; -class Geom_Transformation; - -//! \class Convert_Tools -//! \brief The tool that gives auxiliary methods for qt elements manipulation. -class Convert_Tools -{ -public: - //! Reads Shape using BREP reader - //! \param theFileName a file name - //! \return shape or NULL - Standard_EXPORT static TopoDS_Shape ReadShape(const TCollection_AsciiString& theFileName); - - //! Creates shape presentations on the stream if possible. Tries to init some OCCT base for a new - //! presentation \param theStream source of presentation \param thePresentations container to - //! collect new presentations - Standard_EXPORT static void ConvertStreamToPresentations( - const Standard_SStream& theSStream, - const Standard_Integer theStartPos, - const Standard_Integer theLastPos, - NCollection_List& thePresentations); - - //! Converts stream to color if possible. It processes Quantity_Color, Quantity_ColorRGBA - //! \param theStream source of presentation - //! \param[out] theColor converted color - //! \returns true if done - Standard_EXPORT static Standard_Boolean ConvertStreamToColor(const Standard_SStream& theSStream, - Quantity_Color& theColor); - - //! Creates box shape - //! \param theBoundingBox box shape parameters - //! \return created shape - Standard_EXPORT static Standard_Boolean CreateShape(const Bnd_Box& theBoundingBox, - TopoDS_Shape& theShape); - - //! Creates box shape - //! \param theBoundingBox box shape parameters - //! \return created shape - Standard_EXPORT static Standard_Boolean CreateShape(const Bnd_OBB& theBoundingBox, - TopoDS_Shape& theShape); - - //! Creates box shape - //! \param thePntMin minimum point on the bounding box - //! \param thePntMax maximum point on the bounding box - //! \return created shape - Standard_EXPORT static Standard_Boolean CreateBoxShape(const gp_Pnt& thePntMin, - const gp_Pnt& thePntMax, - TopoDS_Shape& theShape); - - //! Creates presentation AIS_Line - //! \param theLine source line - //! \param thePresentations container to collect new presentations - Standard_EXPORT static void CreatePresentation( - const Handle(Geom_Line)& theLine, - NCollection_List& thePresentations); - - //! Creates presentation AIS_Plane - //! \param thePlane source plane - //! \param thePresentations container to collect new presentations - Standard_EXPORT static void CreatePresentation( - const Handle(Geom_Plane)& thePlane, - NCollection_List& thePresentations); - - //! Creates two presentations base on gp_Trsf: box in initial place and transformed box - //! \param thePlane source plane - //! \param thePresentations container to collect new presentations - Standard_EXPORT static void CreatePresentation( - const gp_Trsf& theTrsf, - NCollection_List& thePresentations); -}; - -#endif diff --git a/tools/Convert/Convert_TransientShape.hxx b/tools/Convert/Convert_TransientShape.hxx deleted file mode 100644 index fcaeb6fe45..0000000000 --- a/tools/Convert/Convert_TransientShape.hxx +++ /dev/null @@ -1,50 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef Convert_TransientShape_H -#define Convert_TransientShape_H - -#include -#include -#include -#include -#include - -#include - -//! \class Convert_TransientShape -//! \brief An interface to convert a shape into a transient object to be used in arguments -class Convert_TransientShape : public Standard_Transient -{ -public: - //! Constructor - Convert_TransientShape(const TopoDS_Shape& theShape) { SetShape(theShape); } - - //! Destructor - virtual ~Convert_TransientShape() {} - - //! Returns current shape - const TopoDS_Shape Shape() const { return myShape; } - - //! Fills current shape - void SetShape(const TopoDS_Shape& theShape) { myShape = theShape; } - - DEFINE_STANDARD_RTTI_INLINE(Convert_TransientShape, Standard_Transient) - -private: - TopoDS_Shape myShape; //!< the shape -}; - -#endif diff --git a/tools/Convert/FILES b/tools/Convert/FILES deleted file mode 100644 index 77362ef432..0000000000 --- a/tools/Convert/FILES +++ /dev/null @@ -1,3 +0,0 @@ -Convert_Tools.cxx -Convert_Tools.hxx -Convert_TransientShape.hxx diff --git a/tools/DFBrowser/DFBrowser.qrc b/tools/DFBrowser/DFBrowser.qrc deleted file mode 100644 index e1f167f061..0000000000 --- a/tools/DFBrowser/DFBrowser.qrc +++ /dev/null @@ -1,18 +0,0 @@ - - - icons/attribute.png - icons/attribute_40x40.png - icons/export_shape.png - icons/folder_export.png - icons/item_type_folder.png - icons/item_type_folder_40x40.png - icons/level_change.png - icons/named_shape.png - icons/named_shape_40x40.png - icons/search.png - icons/search_cancel.png - icons/treeline_backward.png - icons/treeline_forward.png - icons/treeline_update.png - - diff --git a/tools/DFBrowser/DFBrowser_AttributePaneStack.cxx b/tools/DFBrowser/DFBrowser_AttributePaneStack.cxx deleted file mode 100644 index d59a209324..0000000000 --- a/tools/DFBrowser/DFBrowser_AttributePaneStack.cxx +++ /dev/null @@ -1,153 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_AttributePaneStack::DFBrowser_AttributePaneStack(QObject* theParent) - : QObject(theParent), - myCurrentPane(0), - myAttributesStack(0), - myModule(0), - myTreeLevelView(0), - mySearchView(0), - myEmptyWidget(0), - myPaneMode(DFBrowser_AttributePaneType_ItemView) -{ - myPaneSelector = new DFBrowserPane_AttributePaneSelector(theParent); -} - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -void DFBrowser_AttributePaneStack::CreateWidget(QWidget* theParent) -{ - myAttributesStack = new QStackedWidget(theParent); - ViewControl_Tools::SetWhiteBackground(myAttributesStack); - myEmptyWidget = new QWidget(theParent); - ViewControl_Tools::SetWhiteBackground(myEmptyWidget); - - myAttributesStack->addWidget(myEmptyWidget); - - myTreeLevelView = new DFBrowser_TreeLevelView(theParent); - myAttributesStack->addWidget(myTreeLevelView->GetControl()); - - mySearchView = new DFBrowser_SearchView(theParent); - myAttributesStack->addWidget(mySearchView->GetControl()); - - myAttributesStack->setCurrentWidget(myEmptyWidget); -} - -// ======================================================================= -// function : SetPaneMode -// purpose : -// ======================================================================= -void DFBrowser_AttributePaneStack::SetPaneMode(const DFBrowser_AttributePaneType& theMode) -{ - if (myPaneMode == theMode) - return; - - myPaneMode = theMode; - if (myPaneMode == DFBrowser_AttributePaneType_SearchView) - { - // clear highlight in tree model - DFBrowser_TreeModel* aModel = dynamic_cast(myModule->GetOCAFViewModel()); - if (aModel && aModel->HasHighlighted()) - aModel->SetHighlighted(QModelIndexList()); - myAttributesStack->setCurrentWidget(mySearchView->GetControl()); - } - else - { - QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel(); - QModelIndex anIndex = - TreeModel_ModelBase::SingleSelected(aSelectionModel->selectedIndexes(), 0); - SetCurrentItem(anIndex); - } -} - -// ======================================================================= -// function : SetCurrentItem -// purpose : -// ======================================================================= -void DFBrowser_AttributePaneStack::SetCurrentItem(const QModelIndex& theIndex) -{ - if (myPaneMode != DFBrowser_AttributePaneType_ItemView) - return; - - // clear highlight in tree model - DFBrowser_TreeModel* aModel = dynamic_cast(myModule->GetOCAFViewModel()); - if (aModel && aModel->HasHighlighted()) - aModel->SetHighlighted(QModelIndexList()); - - myCurrentPane = 0; - QWidget* aWidget = 0; - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(theIndex); - if (!anItemBase) - return; - - if (DFBrowser_TreeLevelView::ProcessItem(theIndex)) - aWidget = myTreeLevelView->GetControl(); - else - { - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - if (!anItem) - return; - - if (myAttributesStack->currentWidget() == myTreeLevelView->GetControl()) - myTreeLevelView->ClearSelection(); - Handle(TDF_Attribute) anAttribute = anItem->GetAttribute(); - myCurrentPane = myModule->GetAttributePane(anAttribute); - - if (myCurrentPane) - { - aWidget = myCurrentPane->GetWidget(myAttributesStack, true); - if (aWidget) - { - int aWidgetIndex = myAttributesStack->indexOf(aWidget); - if (aWidgetIndex < 0) - myAttributesStack->addWidget(aWidget); - } - myCurrentPane->Init(anAttribute); - - std::list aSelectionModels = myCurrentPane->GetSelectionModels(); - myPaneSelector->SetCurrentSelectionModels(aSelectionModels); - } - } - myAttributesStack->setCurrentWidget(aWidget != NULL ? aWidget : myEmptyWidget); -} diff --git a/tools/DFBrowser/DFBrowser_AttributePaneStack.hxx b/tools/DFBrowser/DFBrowser_AttributePaneStack.hxx deleted file mode 100644 index 7d81efecce..0000000000 --- a/tools/DFBrowser/DFBrowser_AttributePaneStack.hxx +++ /dev/null @@ -1,94 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_AttributePaneStack_H -#define DFBrowser_AttributePaneStack_H - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -class DFBrowserPane_AttributePaneAPI; -class DFBrowserPane_AttributePaneSelector; -class DFBrowser_Module; -class DFBrowser_SearchView; -class DFBrowser_TreeLevelView; - -class QStackedWidget; -class QWidget; - -//! \class DFBrowser_AttributePaneStack -//! \brief Provides work to stacked widget where the current attribute pane is shown. -class DFBrowser_AttributePaneStack : public QObject -{ -public: - //! Constructor - Standard_EXPORT DFBrowser_AttributePaneStack(QObject* theParent); - - //! Destructor - virtual ~DFBrowser_AttributePaneStack() {} - - //! Creates a stacked widget - //! \param theParent a parent widget - Standard_EXPORT virtual void CreateWidget(QWidget* theParent); - - //! \return the stacked widget - QWidget* GetWidget() const { return myAttributesStack; } - - //! Fills stack with the information - //! \param theAttributeTypes a map of attribute type name to information pane - void SetModule(DFBrowser_Module* theModule) { myModule = theModule; } - - //! Sets the current widget in the stacked control either attribute pane or search view - //! \param theMode an active mode - Standard_EXPORT void SetPaneMode(const DFBrowser_AttributePaneType& theMode); - - //! \return an attribute pane, which corresponds the current widget of the stacked widget control - DFBrowserPane_AttributePaneAPI* GetCurrentPane() const { return myCurrentPane; } - - //! \return tree level view - DFBrowser_TreeLevelView* GetTreeLevelView() const { return myTreeLevelView; } - - //! \return the search view - DFBrowser_SearchView* GetSearchView() const { return mySearchView; } - - //! \return the pane selector - DFBrowserPane_AttributePaneSelector* GetPaneSelector() const { return myPaneSelector; } - - //! Sets an active widget of attribute pane if the pane mode is item view mode. - //! Gets selection models of this pane and set the models into pane selector - Standard_EXPORT void SetCurrentItem(const QModelIndex& theIndex); - -protected: - DFBrowserPane_AttributePaneAPI* myCurrentPane; //!< active pane if mode is item view mode - DFBrowserPane_AttributePaneSelector* myPaneSelector; //!< pane selector filled by the active pane - QStackedWidget* myAttributesStack; //!< container of already created panes - DFBrowser_Module* myModule; //!< the current module - DFBrowser_TreeLevelView* myTreeLevelView; //!< view of objects from one level of tree view - DFBrowser_SearchView* mySearchView; //!< view of search control - QWidget* myEmptyWidget; //!< an empty widget when nothing is selected in tree view - DFBrowser_AttributePaneType - myPaneMode; //!< the current pane mode, either item view or search view -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_AttributePaneType.hxx b/tools/DFBrowser/DFBrowser_AttributePaneType.hxx deleted file mode 100644 index f25164e8a1..0000000000 --- a/tools/DFBrowser/DFBrowser_AttributePaneType.hxx +++ /dev/null @@ -1,27 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_AttributePaneType_H -#define DFBrowser_AttributePaneType_H - -//! Type of view shown in attribute pane stack -enum DFBrowser_AttributePaneType -{ - DFBrowser_AttributePaneType_ItemView, //!< attribute pane stack shows either TreeLevelView or - //!< attribute pane - DFBrowser_AttributePaneType_SearchView //!< attribute pane stack shows search view -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_Communicator.cxx b/tools/DFBrowser/DFBrowser_Communicator.cxx deleted file mode 100644 index 5ebb6b4d29..0000000000 --- a/tools/DFBrowser/DFBrowser_Communicator.cxx +++ /dev/null @@ -1,50 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -// ======================================================================= -// function : CreateCommunicator -// purpose : Creates a communicator by the library loading -// ======================================================================= -Standard_EXPORTEXTERNC TInspectorAPI_Communicator* CreateCommunicator() -{ - return new DFBrowser_Communicator(); -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_Communicator::DFBrowser_Communicator() - : TInspectorAPI_Communicator(), - myWindow(0) -{ - myWindow = new DFBrowser_Window(); -} - -// ======================================================================= -// function : SetParameters -// purpose : -// ======================================================================= -void DFBrowser_Communicator::SetParameters( - const Handle(TInspectorAPI_PluginParameters)& theParameters) -{ - myWindow->SetParameters(theParameters); - myWindow->UpdateContent(); -} diff --git a/tools/DFBrowser/DFBrowser_Communicator.hxx b/tools/DFBrowser/DFBrowser_Communicator.hxx deleted file mode 100644 index 494ee16c90..0000000000 --- a/tools/DFBrowser/DFBrowser_Communicator.hxx +++ /dev/null @@ -1,80 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_Communicator_H -#define DFBrowser_Communicator_H - -#include -#include - -#include -#include - -#include -#include -#include - -class DFBrowser_Window; - -//! \class DFBrowser_Communicator. -//! \brief This is a connector from TInspector application to DFBrowser view -class DFBrowser_Communicator : public QObject, public TInspectorAPI_Communicator -{ -public: - //! Constructor - Standard_EXPORT DFBrowser_Communicator(); - - //! Destructor - virtual ~DFBrowser_Communicator() {} - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - virtual void SetParent(void* theParent) Standard_OVERRIDE { myWindow->SetParent(theParent); } - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - Standard_EXPORT virtual void SetParameters( - const Handle(TInspectorAPI_PluginParameters)& theParameters) Standard_OVERRIDE; - - //! Provides container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - Standard_EXPORT virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE - { - myWindow->FillActionsMenu(theMenu); - } - - //! Returns plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->GetPreferences(theItem); - } - - //! Stores plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->SetPreferences(theItem); - } - - //! Updates content of the current window - virtual void UpdateContent() Standard_OVERRIDE { myWindow->UpdateContent(); } - -private: - DFBrowser_Window* myWindow; //!< the current window -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_DumpView.cxx b/tools/DFBrowser/DFBrowser_DumpView.cxx deleted file mode 100644 index 7fe94fdf52..0000000000 --- a/tools/DFBrowser/DFBrowser_DumpView.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : onSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_DumpView::OnTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - myTextEdit->setVisible(false); - myTextEdit->clear(); - - QModelIndexList aSelectedIndices = theSelected.indexes(); - QModelIndexList aFirstColumnSelectedIndices; - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() == 0) - aFirstColumnSelectedIndices.append(anIndex); - } - if (aFirstColumnSelectedIndices.size() != 1) - return; - - QString aDumpInfo; - const QModelIndex& anIndex = aFirstColumnSelectedIndices.first(); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowser_ItemPtr anItem; - if (anItemBase) - anItem = itemDynamicCast(anItemBase); - - if (!anItem) - return; - - TCollection_AsciiString aFileName = DFBrowser_Window::TmpDirectory(); - aFileName += "/dfbrowser.txt"; - // print dump to file(not in a string stream because result might be too long) - std::ofstream aFileStream; - OSD_OpenStream(aFileStream, aFileName, std::ios::out); - if (anItem->HasAttribute()) - { - Handle(TDF_Attribute) anAttribute = anItem->GetAttribute(); - if (!anAttribute.IsNull()) - anAttribute->Dump(aFileStream); - } - else if (anItem->HasLabel()) - anItem->GetLabel().Dump(aFileStream); - aFileStream.close(); - - // read dumped file to fill view - QFile aFile(aFileName.ToCString()); - if (!aFile.open(QIODevice::ReadOnly | QIODevice::Text)) - return; - QTextStream aStream(&aFile); - while (!aStream.atEnd()) - { - aDumpInfo.append(QString("%1\n").arg(aStream.readLine())); - } - aFile.close(); - QDir aDir; - aDir.remove(aFileName.ToCString()); - if (!aDumpInfo.isEmpty()) - { - myTextEdit->setVisible(true); - myTextEdit->setPlainText(aDumpInfo); - } -} diff --git a/tools/DFBrowser/DFBrowser_DumpView.hxx b/tools/DFBrowser/DFBrowser_DumpView.hxx deleted file mode 100644 index 1fe7736ecf..0000000000 --- a/tools/DFBrowser/DFBrowser_DumpView.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_DumpView_H -#define DFBrowser_DumpView_H - -#include -#include - -#include -#include -#include -#include -#include - -class QWidget; - -//! \class DFBrowser_DumpView -//! \brief View to display result of Dump() method of a TDF_Attribute -class DFBrowser_DumpView : public QObject -{ - Q_OBJECT -public: - //! Constructor - DFBrowser_DumpView(QWidget* theParent) - : QObject(theParent), - myTextEdit(new QPlainTextEdit(theParent)) - { - } - - //! Destructor - virtual ~DFBrowser_DumpView() {} - - //! \return the text edit control - QWidget* GetControl() const { return myTextEdit; } - -public slots: - - //! Listens selection change and update the current control content by selection - //! \param theSelected container of selected items - //! \param theDeselected container of items that become deselected - Standard_EXPORT void OnTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -private: - QPlainTextEdit* myTextEdit; //!< information view -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx b/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx deleted file mode 100644 index 6aba8ea943..0000000000 --- a/tools/DFBrowser/DFBrowser_HighlightDelegate.cxx +++ /dev/null @@ -1,39 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include -#include - -// ======================================================================= -// function : paint -// purpose : -// ======================================================================= -void DFBrowser_HighlightDelegate::paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const -{ - // highlight cell - if (theOption.state & QStyle::State_MouseOver) - { - QColor aHighlightColor = DFBrowserPane_Tools::LightHighlightColor(); - thePainter->fillRect(theOption.rect, aHighlightColor); - } - // default paint - QItemDelegate::paint(thePainter, theOption, theIndex); -} diff --git a/tools/DFBrowser/DFBrowser_HighlightDelegate.hxx b/tools/DFBrowser/DFBrowser_HighlightDelegate.hxx deleted file mode 100644 index 1c8c2ed282..0000000000 --- a/tools/DFBrowser/DFBrowser_HighlightDelegate.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_HighlightDelegate_H -#define DFBrowser_HighlightDelegate_H - -#include -#include - -#include -#include -#include - -//! \class DFBrowser_HighlightDelegate -//! \brief An item delegate to paint in highlight color the cell when the mouse cursor is over it -class DFBrowser_HighlightDelegate : public QItemDelegate -{ -public: - //! Constructor - DFBrowser_HighlightDelegate(QObject* theParent = 0) - : QItemDelegate(theParent) - { - } - - //! Destructor - virtual ~DFBrowser_HighlightDelegate() {} - - //! Redefines of the parent virtual method to color the cell rectangle in highlight style - //! \param thePainter a painter - //! \param theOption a paint options - //! \param theIndex a view index - Standard_EXPORT virtual void paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const Standard_OVERRIDE; -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_Item.cxx b/tools/DFBrowser/DFBrowser_Item.cxx deleted file mode 100644 index 821180f343..0000000000 --- a/tools/DFBrowser/DFBrowser_Item.cxx +++ /dev/null @@ -1,216 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : hasAttribute -// purpose : -// ======================================================================= -bool DFBrowser_Item::HasAttribute() const -{ - initItem(); - return myAttributeGUID != Standard_GUID(); -} - -// ======================================================================= -// function : getAttribute -// purpose : -// ======================================================================= -Handle(TDF_Attribute) DFBrowser_Item::GetAttribute() const -{ - initItem(); - Handle(TDF_Attribute) anAttribute; - GetLabel().FindAttribute(myAttributeGUID, anAttribute); - return anAttribute; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowser_Item::Init() -{ - DFBrowser_ItemBasePtr aParentItem = itemDynamicCast(Parent()); - if (!aParentItem) - return; - TDF_Label aParentLabel = aParentItem->GetLabel(); - // items can exist only by items with not empty label - if (aParentLabel.IsNull()) - return; - - int aNbAttributes = aParentLabel.NbAttributes(); - int aRowId = Row(); - if (aRowId < aNbAttributes) - { - Handle(TDF_Attribute) anAttribute; - int anAttributeId = 0; - for (TDF_AttributeIterator anAttrIt(aParentLabel); anAttrIt.More(); - anAttrIt.Next(), anAttributeId++) - { - if (anAttributeId == aRowId) - anAttribute = anAttrIt.Value(); - } - SetAttribute(anAttribute); - } - else - { - int aCurrentId = aRowId - aNbAttributes; - TDF_ChildIterator aLabelsIt(aParentLabel); - TDF_Label aLabel; - for (int aLabelId = 0; aLabelsIt.More(); aLabelsIt.Next(), aLabelId++) - { - if (aLabelId < aCurrentId) - continue; - aLabel = aLabelsIt.Value(); - break; - } - if (!aLabel.IsNull()) - setLabel(aLabel); - } - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : reset -// purpose : -// ======================================================================= -void DFBrowser_Item::Reset() -{ - SetAttribute(Handle(TDF_Attribute)()); - - DFBrowser_ItemBase::Reset(); -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int DFBrowser_Item::initRowCount() const -{ - return HasAttribute() ? 0 : DFBrowser_ItemBase::initRowCount(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant DFBrowser_Item::initValue(const int theItemRole) const -{ - if (!HasAttribute()) - return DFBrowser_ItemBase::initValue(theItemRole); - - if (theItemRole == DFBrowserPane_ItemRole_DisplayExtended - || theItemRole == DFBrowserPane_ItemRole_ToolTipExtended) - { - int aRole = - theItemRole == DFBrowserPane_ItemRole_DisplayExtended ? Qt::DisplayRole : Qt::ToolTipRole; - QVariant aValue = - DFBrowser_Module::GetAttributeInfo(GetAttribute(), GetModule(), aRole, Column()); - QString anAdditionalInfo = DFBrowser_Module::GetAttributeInfo(GetAttribute(), - GetModule(), - DFBrowser_ItemRole_AdditionalInfo, - Column()) - .toString(); - if (!anAdditionalInfo.isEmpty()) - { - if (theItemRole == DFBrowserPane_ItemRole_DisplayExtended) - anAdditionalInfo = TreeModel_Tools::CutString(anAdditionalInfo); - if (!anAdditionalInfo.isEmpty()) - aValue = QVariant(aValue.toString() + QString(" [%1]").arg(anAdditionalInfo)); - // if (aRole == Qt::ToolTipRole) - // aValue = wrapTextByWords(aValue.toString().toStdString(), INFO_LENGHT).c_str(); - } - return aValue; - } - - return DFBrowser_Module::GetAttributeInfo(GetAttribute(), GetModule(), theItemRole, Column()); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void DFBrowser_Item::initStream(Standard_OStream& theOStream) const -{ - if (!HasAttribute()) - return; - - if (DFBrowser_Window::IsUseDumpJson()) - { - Handle(TDF_Attribute) anAttribute = GetAttribute(); - if (!anAttribute.IsNull()) - { - anAttribute->DumpJson(theOStream); - } - } -} - -// ======================================================================= -// function : GetAttributeInfo -// purpose : -// ======================================================================= -QVariant DFBrowser_Item::GetAttributeInfo(int theRole) const -{ - initItem(); - return cachedValue(theRole); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void DFBrowser_Item::initItem() const -{ - if (IsInitialized()) - return; - - const_cast(this)->Init(); -} - -// ======================================================================= -// function : SetAttribute -// purpose : -// ======================================================================= -void DFBrowser_Item::SetAttribute(Handle(TDF_Attribute) theAttribute) -{ - if (!theAttribute.IsNull()) - { - setLabel(theAttribute->Label()); - myAttributeGUID = theAttribute->ID(); - } - else - { - setLabel(TDF_Label()); - myAttributeGUID = Standard_GUID(); - } -} diff --git a/tools/DFBrowser/DFBrowser_Item.hxx b/tools/DFBrowser/DFBrowser_Item.hxx deleted file mode 100644 index 647f28d9b0..0000000000 --- a/tools/DFBrowser/DFBrowser_Item.hxx +++ /dev/null @@ -1,106 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_Item_H -#define DFBrowser_Item_H - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -class DFBrowser_Item; -typedef QExplicitlySharedDataPointer DFBrowser_ItemPtr; - -//! \class DFBrowser_Item -//! \brief Declaration of the tree model root item. -class DFBrowser_Item : public DFBrowser_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - //! \return the pointer to the created item - static DFBrowser_ItemPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return DFBrowser_ItemPtr(new DFBrowser_Item(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~DFBrowser_Item() {} - - //! \return true if the attribute is set in the item, otherwise it is initialized by a label - Standard_EXPORT bool HasAttribute() const; - - //! \return the item attribute - Standard_EXPORT Handle(TDF_Attribute) GetAttribute() const; - - //! Finds int parent item attribute or label by this item row and store it in a field of this - //! item. - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets the cached item values, set null attribute and calls reset of the parent class - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Inits item and calls cachedValue() for the role - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT QVariant GetAttributeInfo(int theRole) const; - -protected: - //! \return number of children. - virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns data value for the role: - //! - if content is label, calls DFBrowser_ItemBase; - //! - if content is attribute, if the fole is extended display, asks additional info text or ask - //! module about info \param theItemRole a value role \return the value - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - - //! Constructor - //! \param theParent a parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - DFBrowser_Item(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : DFBrowser_ItemBase(theParent, theRow, theColumn) - { - } - - //! Initializes the current item. It creates a backup of the specific item information - virtual void initItem() const Standard_OVERRIDE; - - //! Sets the item attribute - //! \param theAttribute an item attribute - void SetAttribute(Handle(TDF_Attribute) theAttribute); - -private: - Standard_GUID myAttributeGUID; //!< if attribute, stores GUID of the attribute because label can - //!< contain only one attribute of a kind -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_ItemApplication.cxx b/tools/DFBrowser/DFBrowser_ItemApplication.cxx deleted file mode 100644 index 06c475b702..0000000000 --- a/tools/DFBrowser/DFBrowser_ItemApplication.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr DFBrowser_ItemApplication::createChild(int theRow, int theColumn) -{ - TreeModel_ItemBasePtr anItem = - DFBrowser_ItemDocument::CreateItem(currentItem(), theRow, theColumn); - DFBrowser_ItemBasePtr aBaseItem = itemDynamicCast(anItem); - aBaseItem->SetModule(GetModule()); - - return anItem; -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int DFBrowser_ItemApplication::initRowCount() const -{ - if (myApplication.IsNull()) - return 0; - - return myApplication->NbDocuments(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant DFBrowser_ItemApplication::initValue(const int theItemRole) const -{ - if (theItemRole == Qt::DisplayRole || theItemRole == Qt::EditRole - || theItemRole == Qt::ToolTipRole || theItemRole == DFBrowserPane_ItemRole_DisplayExtended - || theItemRole == DFBrowserPane_ItemRole_ToolTipExtended) - { - return "TDocStd_Application"; - } - return QVariant(); -} diff --git a/tools/DFBrowser/DFBrowser_ItemApplication.hxx b/tools/DFBrowser/DFBrowser_ItemApplication.hxx deleted file mode 100644 index c29eb38b59..0000000000 --- a/tools/DFBrowser/DFBrowser_ItemApplication.hxx +++ /dev/null @@ -1,81 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_ItemApplication_H -#define DFBrowser_ItemApplication_H - -#include - -#include - -class DFBrowser_ItemApplication; -typedef QExplicitlySharedDataPointer DFBrowser_ItemApplicationPtr; - -//! \class DFBrowser_ItemApplication -//! \brief Declaration of the tree model root item. -//! This item is connected to the main label of the document. -class DFBrowser_ItemApplication : public DFBrowser_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static DFBrowser_ItemApplicationPtr CreateItem(TreeModel_ItemBasePtr theParent) - { - return DFBrowser_ItemApplicationPtr(new DFBrowser_ItemApplication(theParent)); - } - - //! Destructor - virtual ~DFBrowser_ItemApplication() {} - - //! Sets the item label - //! \param theLabel an object where the child items structure is found - void SetApplication(const Handle(TDocStd_Application)& theApplication) - { - myApplication = theApplication; - } - - //! Returns the current label - //! \return a label - const Handle(TDocStd_Application)& GetApplication() const { return myApplication; } - -protected: - //! Returns number of documents if the application is not NULL - //! \return rows count - virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns fixed item text or empty. - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - -protected: - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! \param theParent a parent item - DFBrowser_ItemApplication(TreeModel_ItemBasePtr theParent) - : DFBrowser_ItemBase(theParent, 0, 0) - { - } - -private: - Handle(TDocStd_Application) myApplication; //! - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_ItemBase::DFBrowser_ItemBase(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn), - myModule(0), - myIsUseAdditionalInfo(true) -{ -} - -// ======================================================================= -// function : reset -// purpose : -// ======================================================================= -void DFBrowser_ItemBase::Reset() -{ - setLabel(TDF_Label()); - TreeModel_ItemBase::Reset(); -} - -// ======================================================================= -// function : GetLabel -// purpose : -// ======================================================================= -TDF_Label DFBrowser_ItemBase::GetLabel() const -{ - initItem(); - return myLabel; -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowser_ItemBase::data(const QModelIndex& theIndex, int theRole) const -{ - int aRole = theRole; - if (Column() == 0 && useAdditionalInfo()) - { - switch (theRole) - { - case Qt::DisplayRole: { - aRole = DFBrowserPane_ItemRole_DisplayExtended; - break; - } - case Qt::ToolTipRole: { - aRole = DFBrowserPane_ItemRole_ToolTipExtended; - break; - } - } - } - return TreeModel_ItemBase::data(theIndex, aRole); -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int DFBrowser_ItemBase::initRowCount() const -{ - TDF_Label aLabel = GetLabel(); - if (aLabel.IsNull()) - return 0; - - return aLabel.NbChildren() + aLabel.NbAttributes(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant DFBrowser_ItemBase::initValue(const int theItemRole) const -{ - switch (theItemRole) - { - case Qt::DisplayRole: - case Qt::EditRole: - case Qt::ToolTipRole: - return DFBrowser_Tools::GetLabelInfo(myLabel, false); - case DFBrowserPane_ItemRole_DisplayExtended: - case DFBrowserPane_ItemRole_ToolTipExtended: - return DFBrowser_Tools::GetLabelInfo(myLabel, true); - case Qt::ForegroundRole: { - QVariant aValue = QColor(Qt::black); - if (DFBrowser_Tools::IsEmptyLabel(GetLabel())) - aValue = QColor(Qt::lightGray); - else - { // TEMPORARY HERE : should be moved in the pane of TDataStd_Name kind of attribute - Handle(TDataStd_Name) aName; - if (useAdditionalInfo() && myLabel.FindAttribute(TDataStd_Name::GetID(), aName)) - aValue = QColor(Qt::darkGreen); - } - return aValue; - } - case Qt::DecorationRole: - return DFBrowser_Tools::GetLabelIcon(myLabel); - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr DFBrowser_ItemBase::createChild(int theRow, int theColumn) -{ - TreeModel_ItemBasePtr anItem = DFBrowser_Item::CreateItem(currentItem(), theRow, theColumn); - DFBrowser_ItemBasePtr aBaseItem = itemDynamicCast(anItem); - aBaseItem->SetModule(GetModule()); - - return anItem; -} - -// ======================================================================= -// function : SetUseAdditionalInfo -// purpose : -// ======================================================================= -bool DFBrowser_ItemBase::SetUseAdditionalInfo(const bool theValue) -{ - bool aPreviousValue = myIsUseAdditionalInfo; - myIsUseAdditionalInfo = theValue; - return aPreviousValue; -} diff --git a/tools/DFBrowser/DFBrowser_ItemBase.hxx b/tools/DFBrowser/DFBrowser_ItemBase.hxx deleted file mode 100644 index efc6843751..0000000000 --- a/tools/DFBrowser/DFBrowser_ItemBase.hxx +++ /dev/null @@ -1,101 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_ItemBase_H -#define DFBrowser_ItemBase_H - -#include -#include - -#include - -class DFBrowser_ItemBase; -class DFBrowser_Module; -typedef QExplicitlySharedDataPointer DFBrowser_ItemBasePtr; - -//! \class DFBrowser_ItemBase -//! \brief Declaration of the tree model base item. -//! This item provide method to process a TDF label. -class DFBrowser_ItemBase : public TreeModel_ItemBase -{ -public: - //! Sets the module to have an access to attribute information - //! \param theModule a current loaded application module - void SetModule(DFBrowser_Module* theModule) { myModule = theModule; } - - //! Resets the cached item values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! \return true if the current label is not null - bool HasLabel() const { return !GetLabel().IsNull(); } - - //! \return the current label - Standard_EXPORT virtual TDF_Label GetLabel() const; - - //! \return the current module - DFBrowser_Module* GetModule() const { return myModule; } - - //! Changes using of additional information in item. If it does not use additional info, - //! it will not return extended text in initValue(). - //! \param theValue a new value - //! \return the previous value - Standard_EXPORT bool SetUseAdditionalInfo(const bool theValue); - - //! Returns the data stored under the given role for the current item - //! \param theIndex the item model index - //! \param theRole the item model role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole) const Standard_OVERRIDE; - -protected: - //! Sets the item label - //! \param theLabel an object where the child items structure is found - void setLabel(TDF_Label theLabel) { myLabel = theLabel; } - - //! Returns if additional information is shown in item for Display and ToolTip values - //! \return boolean value - bool useAdditionalInfo() const { return myIsUseAdditionalInfo; } - - //! Returns sum of label children and attributes - //! \return rows count - virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns label information like text, icon or background(if it contains TDataStd_Name - //! attribute) \param theItemRole a value role \return the value - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - - //! Initializes the current item. It creates a backup of the specific item information - virtual void initItem() const Standard_OVERRIDE {} - -protected: - //! Constructor - //! \param theParent a parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - DFBrowser_ItemBase(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn); - -private: - TDF_Label myLabel; //!< a label of the document, which contains child labels and attributes - DFBrowser_Module* myModule; //!< the current module - bool myIsUseAdditionalInfo; //!< if true, additional item info is shown in square brackets -}; - -#endif \ No newline at end of file diff --git a/tools/DFBrowser/DFBrowser_ItemDocument.cxx b/tools/DFBrowser/DFBrowser_ItemDocument.cxx deleted file mode 100644 index 046303c3fa..0000000000 --- a/tools/DFBrowser/DFBrowser_ItemDocument.cxx +++ /dev/null @@ -1,149 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : GetLabel -// purpose : -// ======================================================================= -TDF_Label DFBrowser_ItemDocument::GetLabel() const -{ - TDF_Label aLabel; - if (myDocument.IsNull()) - getDocument(); - - if (!myDocument.IsNull()) - aLabel = myDocument->Main().Root(); - - if (!aLabel.IsNull()) - aLabel = aLabel.Root(); - - return aLabel; -} - -// ======================================================================= -// function : getDocument -// purpose : -// ======================================================================= -const Handle(TDocStd_Document)& DFBrowser_ItemDocument::getDocument() const -{ - initItem(); - return myDocument; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant DFBrowser_ItemDocument::initValue(const int theItemRole) const -{ - if (theItemRole == Qt::DisplayRole || theItemRole == Qt::EditRole - || theItemRole == DFBrowserPane_ItemRole_DisplayExtended - || theItemRole == DFBrowserPane_ItemRole_ToolTipExtended) - return DFBrowser_Tools::GetLabelInfo(GetLabel()); - if (theItemRole == Qt::DecorationRole) - return DFBrowser_Tools::GetLabelIcon(GetLabel()); - - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr DFBrowser_ItemDocument::createChild(int theRow, int theColumn) -{ - TreeModel_ItemBasePtr anItem = DFBrowser_Item::CreateItem(currentItem(), theRow, theColumn); - DFBrowser_ItemBasePtr aBaseItem = itemDynamicCast(anItem); - aBaseItem->SetModule(GetModule()); - - return anItem; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowser_ItemDocument::Init() -{ - DFBrowser_ItemApplicationPtr aParentItem = itemDynamicCast(Parent()); - if (!aParentItem) - return; - - const Handle(TDocStd_Application)& anApplication = aParentItem->GetApplication(); - // items can exist only by items with not empty label - if (anApplication.IsNull()) - return; - - int aRowId = Row(); - - int aDocumentId = -1; - for (Standard_Integer aDocId = 1, aNbDoc = anApplication->NbDocuments(); - aDocId <= aNbDoc && aDocumentId < 0; - aDocId++) - { - if (aDocId - 1 == aRowId) - aDocumentId = aDocId; - } - if (aDocumentId > 0) - { - Handle(TDocStd_Document) aDocument; - anApplication->GetDocument(aDocumentId, aDocument); - setDocument(aDocument); - } - else - setDocument(Handle(TDocStd_Document)()); - - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : reset -// purpose : -// ======================================================================= -void DFBrowser_ItemDocument::Reset() -{ - Handle(TDocStd_Document) aDocument; - setDocument(aDocument); - - DFBrowser_ItemBase::Reset(); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void DFBrowser_ItemDocument::initItem() const -{ - if (IsInitialized()) - return; - - const_cast(this)->Init(); -} diff --git a/tools/DFBrowser/DFBrowser_ItemDocument.hxx b/tools/DFBrowser/DFBrowser_ItemDocument.hxx deleted file mode 100644 index a47a93e056..0000000000 --- a/tools/DFBrowser/DFBrowser_ItemDocument.hxx +++ /dev/null @@ -1,96 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_ItemDocument_H -#define DFBrowser_ItemDocument_H - -#include - -#include -#include - -class DFBrowser_ItemDocument; -typedef QExplicitlySharedDataPointer DFBrowser_ItemDocumentPtr; - -//! \class DFBrowser_ItemDocument -//! \brief Declaration of the tree model document item. -//! This item is connected to the OCAF document. Parent item is application, children are either -//! labels or attributes -class DFBrowser_ItemDocument : public DFBrowser_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - //! \return the pointer to the created item - static DFBrowser_ItemDocumentPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return DFBrowser_ItemDocumentPtr(new DFBrowser_ItemDocument(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~DFBrowser_ItemDocument() {} - - //! Returns the current label - //! \return a label - Standard_EXPORT virtual TDF_Label GetLabel() const Standard_OVERRIDE; - - //! Sets the item document - //! \param theLabel an object where the child items structure is found - void setDocument(const Handle(TDocStd_Document)& theDocument) { myDocument = theDocument; } - - //! Returns true if the current document is not null - //! \return a boolean value - bool hasDocument() const { return !getDocument().IsNull(); } - - //! Returns the current document - //! \return a label - Standard_EXPORT const Handle(TDocStd_Document)& getDocument() const; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets the cached item values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - -protected: - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Initializes the current item. It creates a backup of the specific item information - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - -protected: - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! \param theParent a parent item - DFBrowser_ItemDocument(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : DFBrowser_ItemBase(theParent, theRow, theColumn) - { - } - -private: - Handle(TDocStd_Document) myDocument; //!< cached application document by the row index of the item -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_ItemRole.hxx b/tools/DFBrowser/DFBrowser_ItemRole.hxx deleted file mode 100644 index fc06006c00..0000000000 --- a/tools/DFBrowser/DFBrowser_ItemRole.hxx +++ /dev/null @@ -1,32 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_ItemRole_H -#define DFBrowser_ItemRole_H - -#include - -#include -#include -#include - -//! Additional data item role for DFBrowser tree item -enum DFBrowser_ItemRole -{ - DFBrowser_ItemRole_AdditionalInfo = - DFBrowserPane_ItemRole_LastTreeRole + 1 //!< an attribute additional information -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_Module.cxx b/tools/DFBrowser/DFBrowser_Module.cxx deleted file mode 100644 index 4093b093f6..0000000000 --- a/tools/DFBrowser/DFBrowser_Module.cxx +++ /dev/null @@ -1,254 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_Module::DFBrowser_Module() - : myOCAFViewModel(0) -{ - RegisterPaneCreator(new DFBrowserPane_AttributePaneCreator()); -} - -// ======================================================================= -// function : CreateViewModel -// purpose : -// ======================================================================= -void DFBrowser_Module::CreateViewModel(void* theParent) -{ - myOCAFViewModel = new DFBrowser_TreeModel((QWidget*)theParent); - myOCAFViewModel->InitColumns(); - myOCAFViewModel->SetModule(this); -} - -// ======================================================================= -// function : SetApplication -// purpose : -// ======================================================================= -void DFBrowser_Module::SetApplication(const Handle(TDocStd_Application)& theApplication) -{ - myOCAFViewModel->Init(theApplication); - - myPaneCreators.clear(); - RegisterPaneCreator(new DFBrowserPane_AttributePaneCreator()); -} - -// ======================================================================= -// function : SetExternalContext -// purpose : -// ======================================================================= -void DFBrowser_Module::SetExternalContext(const Handle(Standard_Transient)& theContext) -{ - myExternalContext = Handle(AIS_InteractiveContext)::DownCast(theContext); -} - -// ======================================================================= -// function : GetTDocStdApplication -// purpose : -// ======================================================================= -Handle(TDocStd_Application) DFBrowser_Module::GetTDocStdApplication() const -{ - return myOCAFViewModel->GetTDocStdApplication(); -} - -// ======================================================================= -// function : UpdateTreeModel -// purpose : -// ======================================================================= -void DFBrowser_Module::UpdateTreeModel() -{ - QAbstractItemModel* aModel = GetOCAFViewModel(); - QItemSelectionModel* aSelectionModel = GetOCAFViewSelectionModel(); - if (!aModel || !aSelectionModel) - return; - aSelectionModel->clearSelection(); - - emit beforeUpdateTreeModel(); - myOCAFViewModel->Reset(); - myOCAFViewModel->EmitLayoutChanged(); - - SetInitialTreeViewSelection(); -} - -// ======================================================================= -// function : SetInitialTreeViewSelection -// purpose : -// ======================================================================= -void DFBrowser_Module::SetInitialTreeViewSelection() -{ - QAbstractItemModel* aModel = GetOCAFViewModel(); - QItemSelectionModel* aSelectionModel = GetOCAFViewSelectionModel(); - if (!aModel || !aSelectionModel) - return; - - // select a parent(application) item - aSelectionModel->select(aModel->index(0, 0), QItemSelectionModel::ClearAndSelect); -} - -// ======================================================================= -// function : FindAttribute -// purpose : -// ======================================================================= -Handle(TDF_Attribute) DFBrowser_Module::FindAttribute(const QModelIndex& theIndex) -{ - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(theIndex); - if (!anItemBase) - return Handle(TDF_Attribute)(); - - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - return (anItem && anItem->HasAttribute()) ? anItem->GetAttribute() : Handle(TDF_Attribute)(); -} - -// ======================================================================= -// function : GetAttributePane -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane( - Handle(TDF_Attribute) theAttribute) -{ - DFBrowserPane_AttributePaneAPI* aPane = 0; - if (theAttribute.IsNull()) - return aPane; - return GetAttributePane(theAttribute->DynamicType()->Name()); -} - -// ======================================================================= -// function : GetAttributePane -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane( - Standard_CString theAttributeName) -{ - DFBrowserPane_AttributePaneAPI* aPane = 0; - - if (!myAttributeTypes.contains(theAttributeName)) - { - aPane = CreateAttributePane(theAttributeName); - if (aPane) - myAttributeTypes[theAttributeName] = aPane; - } - else - aPane = myAttributeTypes[theAttributeName]; - - return aPane; -} - -// ======================================================================= -// function : GetAttributeInfo -// purpose : -// ======================================================================= -QVariant DFBrowser_Module::GetAttributeInfo(Handle(TDF_Attribute) theAttribute, - DFBrowser_Module* theModule, - int theRole, - int theColumnId) -{ - DFBrowserPane_AttributePane* anAttributePane = 0; - if (!theAttribute.IsNull()) - { - DFBrowserPane_AttributePaneAPI* anAPIPane = theModule->GetAttributePane(theAttribute); - if (anAPIPane) - anAttributePane = dynamic_cast(anAPIPane); - } - - TCollection_AsciiString anInfo; - if (theRole == DFBrowser_ItemRole_AdditionalInfo) - { - anInfo = XCAFDoc::AttributeInfo(theAttribute); - } - QVariant aValue; - if (!anInfo.IsEmpty()) - { - aValue = anInfo.ToCString(); - } - else if (anAttributePane) - aValue = anAttributePane->GetAttributeInfo( - theAttribute, - theRole == DFBrowser_ItemRole_AdditionalInfo ? DFBrowserPane_ItemRole_ShortInfo : theRole, - theColumnId); - else - aValue = - DFBrowserPane_AttributePane::GetAttributeInfoByType(theAttribute->DynamicType()->Name(), - theRole, - theColumnId); - return aValue; -} - -// ======================================================================= -// function : GetAttributeInfo -// purpose : -// ======================================================================= -QVariant DFBrowser_Module::GetAttributeInfo(Standard_CString theAttributeName, - DFBrowser_Module* theModule, - int theRole, - int theColumnId) -{ - DFBrowserPane_AttributePane* anAttributePane = 0; - DFBrowserPane_AttributePaneAPI* anAPIPane = theModule->GetAttributePane(theAttributeName); - if (anAPIPane) - anAttributePane = dynamic_cast(anAPIPane); - - QVariant aValue; - if (anAttributePane) - { - Handle(TDF_Attribute) anAttribute; - aValue = anAttributePane->GetAttributeInfo( - anAttribute, - theRole == DFBrowser_ItemRole_AdditionalInfo ? DFBrowserPane_ItemRole_ShortInfo : theRole, - theColumnId); - } - else - aValue = - DFBrowserPane_AttributePane::GetAttributeInfoByType(theAttributeName, theRole, theColumnId); - return aValue; -} - -// ======================================================================= -// function : CreateAttributePane -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneAPI* DFBrowser_Module::CreateAttributePane( - Standard_CString theAttributeName) -{ - DFBrowserPane_AttributePaneAPI* aPane = 0; - // iteration should be performed from the tail of the list, as latest added creator has - // larger priority - for (int aPaneCreatorId = myPaneCreators.size() - 1; aPaneCreatorId >= 0 && !aPane; - aPaneCreatorId--) - aPane = myPaneCreators[aPaneCreatorId]->CreateAttributePane(theAttributeName); - return aPane; -} diff --git a/tools/DFBrowser/DFBrowser_Module.hxx b/tools/DFBrowser/DFBrowser_Module.hxx deleted file mode 100644 index 68e24a6cd8..0000000000 --- a/tools/DFBrowser/DFBrowser_Module.hxx +++ /dev/null @@ -1,161 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_Module_H -#define DFBrowser_Module_H - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -class DFBrowserPane_AttributePaneAPI; -class DFBrowserPane_AttributePaneCreatorAPI; - -class QAbstractItemModel; -class QItemSelectionModel; - -//! \class DFBrowser_Module -//! The class is a container of current components of DFBrowser: -//! - OCAF view model -//! - OCAF selection model -//! - container of attribute panes into attribute name -//! - acceptable attribute pane creators -//! - external AIS interactive context -//! It has general attribute pane creator, if the application is XDE, it uses XDE attribute pane -//! creator. It fills container of created attribute pane. -class DFBrowser_Module : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_Module(); - - //! Destructor - virtual ~DFBrowser_Module() {} - - //! Creates tree model for OCAF application - Standard_EXPORT void CreateViewModel(void* theParent); - - //! Fills tree model by the application and register pane creator - //! \param theApplication a current application - Standard_EXPORT void SetApplication(const Handle(TDocStd_Application)& theApplication); - - //! Fills viewer by the context - //! \param theContext a current context where presentations should be visualized - Standard_EXPORT void SetExternalContext(const Handle(Standard_Transient)& theContext); - - //! Returns external context or NULL - const Handle(AIS_InteractiveContext)& GetExternalContext() const { return myExternalContext; } - - //! Returns a view model with the OCAF structure content - QAbstractItemModel* GetOCAFViewModel() { return myOCAFViewModel; } - - //! Sets selection model of tree view - void SetOCAFViewSelectionModel(QItemSelectionModel* theSelectionModel) - { - myOCAFViewSelectionModel = theSelectionModel; - } - - //! Returns selection model of tree view - QItemSelectionModel* GetOCAFViewSelectionModel() const { return myOCAFViewSelectionModel; } - - //! Returns an OCAF application or NULL - //! \return an application instance - Standard_EXPORT Handle(TDocStd_Application) GetTDocStdApplication() const; - - //! Rebuilds an OCAF tree view model - Standard_EXPORT void UpdateTreeModel(); - - //! Sets initial selection in OCAF tree view, it is an application(root) item - Standard_EXPORT void SetInitialTreeViewSelection(); - - //! Returns attribute placed on the parameter index in the OCAF tree view or NULL - //! \param theIndex an index in OCAF tree view. - //! \return an attribute - Standard_EXPORT Handle(TDF_Attribute) FindAttribute(const QModelIndex& theIndex); - - //! Appends creator of a pane by attribute type - //! \param thePaneCreator - void RegisterPaneCreator(DFBrowserPane_AttributePaneCreatorAPI* thePaneCreator) - { - myPaneCreators.append(thePaneCreator); - } - - //! Returns an attribute pane for the attribute: create a new if it is not exist in - //! internal map and the module processes this kind of attribute - //! \param theAttributeGUID an attribute key - //! \return attribute pane - Standard_EXPORT DFBrowserPane_AttributePaneAPI* GetAttributePane( - Handle(TDF_Attribute) theAttribute); - - //! Returns an attribute pane for the attribute GUID: create a new if it is not exist in - //! internal map and the module processes this kind of attribute - //! \param theAttributeGUID an attribute key - //! \return attribute pane - Standard_EXPORT DFBrowserPane_AttributePaneAPI* GetAttributePane( - Standard_CString theAttributeName); - - //! Finds the attribute pane according to the give attribute and returns its information - //! \param theAttribute a source attribute - //! \param theModule to provide a map of attribute id to attribute pane - //! \param theRole an attribute role in the tree view, includes: text, icon, color roles - //! \param theColumnId a column index - Standard_EXPORT static QVariant GetAttributeInfo(Handle(TDF_Attribute) theAttribute, - DFBrowser_Module* theModule, - int theRole, - int theColumnId); - - //! Returns information for the given attribute type name - //! \param theAttributeName a current attribute type name - //! \param theModule a current module - //! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background - //! and so on) \param theColumnId a tree model column \return value, interpreted by tree model - //! depending on the role - Standard_EXPORT static QVariant GetAttributeInfo(Standard_CString theAttributeName, - DFBrowser_Module* theModule, - int theRole, - int theColumnId); -signals: - - //! Emits signal about updating tree model - void beforeUpdateTreeModel(); - -protected: - //! Tries to create attribute pane for the attribute name using registered attribute pane creators - //! \param theAttributeName a source attribute - //! \return attribute pane or NULL - DFBrowserPane_AttributePaneAPI* CreateAttributePane(Standard_CString theAttributeName); - -private: - DFBrowser_TreeModel* myOCAFViewModel; //!< the tree view abstract model - QItemSelectionModel* myOCAFViewSelectionModel; //!< selection model over OCAF tree view - QMap - myAttributeTypes; //!< container of created panes - QList myPaneCreators; //!< pane creators - Handle(AIS_InteractiveContext) myExternalContext; //!< context that comes in initialize parameters -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_OpenApplication.cxx b/tools/DFBrowser/DFBrowser_OpenApplication.cxx deleted file mode 100644 index 02a17724b2..0000000000 --- a/tools/DFBrowser/DFBrowser_OpenApplication.cxx +++ /dev/null @@ -1,104 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace DFBrowser_OpenApplication -{ - -// ======================================================================= -// function : OpenApplication -// purpose : -// ======================================================================= -Handle(TDocStd_Application) OpenApplication(const TCollection_AsciiString& theFileName, - bool& isSTEPFile) -{ - Handle(TDocStd_Application) anApplication = CreateApplicationBySTEPFile(theFileName); - if (!anApplication.IsNull()) - { - isSTEPFile = true; - return anApplication; - } - - // Load static variables for STEPCAF (ssv; 16.08.2012) - STEPCAFControl_Controller::Init(); - - anApplication = new TDocStd_Application(); - // Initialize standard document formats at creation - they should - // be available even if this DRAW plugin is not loaded by pload command - StdLDrivers::DefineFormat(anApplication); - BinLDrivers::DefineFormat(anApplication); - XmlLDrivers::DefineFormat(anApplication); - StdDrivers::DefineFormat(anApplication); - BinDrivers::DefineFormat(anApplication); - XmlDrivers::DefineFormat(anApplication); - - // Initialize XCAF formats - BinXCAFDrivers::DefineFormat(anApplication); - XmlXCAFDrivers::DefineFormat(anApplication); - - // Register driver in global table for displaying XDE documents - // in 3d viewer using OCAF mechanics - TPrsStd_DriverTable::Get()->AddDriver(XCAFPrs_Driver::GetID(), new XCAFPrs_Driver); - - Handle(TDocStd_Document) aDocument; - PCDM_ReaderStatus aStatus = anApplication->Open(theFileName, aDocument); - if (aStatus != PCDM_RS_OK) - return Handle(TDocStd_Application)(); - return anApplication; -} - -// ======================================================================= -// function : CreateApplicationBySTEPFile -// purpose : -// ======================================================================= -Handle(TDocStd_Application) CreateApplicationBySTEPFile(const TCollection_AsciiString& theFileName) -{ - if (!theFileName.EndsWith(".step") && !theFileName.EndsWith(".stp")) - return Handle(TDocStd_Application)(); - - Handle(TDocStd_Application) aTmpApplication = XCAFApp_Application::GetApplication(); - STEPCAFControl_Reader aStepReader; - - const TCollection_AsciiString aStr(theFileName); - IFSelect_ReturnStatus aStatus = aStepReader.ReadFile(aStr.ToCString()); - if (aStatus != IFSelect_RetDone) - return Handle(TDocStd_Application)(); - - aStepReader.SetColorMode(Standard_True); - aStepReader.SetLayerMode(Standard_True); - aStepReader.SetNameMode(Standard_True); - - Handle(TDocStd_Document) aDocument; - aTmpApplication->NewDocument("BinOcaf", aDocument); - return aStepReader.Transfer(aDocument) ? aTmpApplication : Handle(TDocStd_Application)(); -} -} // namespace DFBrowser_OpenApplication diff --git a/tools/DFBrowser/DFBrowser_OpenApplication.hxx b/tools/DFBrowser/DFBrowser_OpenApplication.hxx deleted file mode 100644 index c020bce521..0000000000 --- a/tools/DFBrowser/DFBrowser_OpenApplication.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_OpenApplication_H -#define DFBrowser_OpenApplication_H - -#include -#include -#include - -//! \namespace DFBrowser_OpenApplication -namespace DFBrowser_OpenApplication -{ - -//! Opens the application by the name. -//! \param theFileName a name of the file initialized the application -//! \param isSTEPFile an output parameter, true if the file name is a STEP file -//! \return an opened application -Standard_EXPORT Handle(TDocStd_Application) OpenApplication( - const TCollection_AsciiString& theFileName, - bool& isSTEPFile); - -//! Creates a new application if the name contains "stp" or "step" extension. The application is -//! "BinOcaf", STEP reader transfers the file into the application \param theFileName a name of the -//! file initialized the application \return a new application -Standard_EXPORT Handle(TDocStd_Application) CreateApplicationBySTEPFile( - const TCollection_AsciiString& theFileName); -} // namespace DFBrowser_OpenApplication - -#endif diff --git a/tools/DFBrowser/DFBrowser_PropertyPanel.cxx b/tools/DFBrowser/DFBrowser_PropertyPanel.cxx deleted file mode 100644 index d63905e0bf..0000000000 --- a/tools/DFBrowser/DFBrowser_PropertyPanel.cxx +++ /dev/null @@ -1,65 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_PropertyPanel::DFBrowser_PropertyPanel(QWidget* theParent) - : QObject(theParent), - myAttributesStack(0) -{ - myMainWindow = new QWidget(theParent); - ViewControl_Tools::SetWhiteBackground(myMainWindow); - - QGridLayout* aLayout = new QGridLayout(myMainWindow); - aLayout->setContentsMargins(0, 0, 0, 0); - - myAttributesStack = new DFBrowser_AttributePaneStack(this); - myAttributesStack->CreateWidget(myMainWindow); - aLayout->addWidget(myAttributesStack->GetWidget(), 0, 0); -} - -// ======================================================================= -// function : UpdateBySelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_PropertyPanel::UpdateBySelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - GetAttributesStack()->GetSearchView()->Reset(); - - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(theSelected.indexes(), 0); - myAttributesStack->SetCurrentItem(anIndex); -} diff --git a/tools/DFBrowser/DFBrowser_PropertyPanel.hxx b/tools/DFBrowser/DFBrowser_PropertyPanel.hxx deleted file mode 100644 index 9802698188..0000000000 --- a/tools/DFBrowser/DFBrowser_PropertyPanel.hxx +++ /dev/null @@ -1,62 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_PropertyPanel_H -#define DFBrowser_PropertyPanel_H - -#include - -#include - -#include -#include -#include -#include - -class DFBrowser_AttributePaneStack; - -class QAbstractItemModel; -class QWidget; - -//! \class DFBrowser_PropertyPanel -//! Control that contains attribute pane stack -class DFBrowser_PropertyPanel : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_PropertyPanel(QWidget* theParent); - - //! Destructor - virtual ~DFBrowser_PropertyPanel() {} - - //! Returns main control - QWidget* GetControl() const { return myMainWindow; } - - //! Returns instance of attributes stack - //! \return stack - DFBrowser_AttributePaneStack* GetAttributesStack() { return myAttributesStack; } - - //! Fills attributes stack by selected index - //! \param theSelected selected items - //! \param theDeselected deselected items - Standard_EXPORT void UpdateBySelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -private: - QWidget* myMainWindow; //!< parent of attribute stack control - DFBrowser_AttributePaneStack* myAttributesStack; //!< panes stack -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_SearchItemInfo.hxx b/tools/DFBrowser/DFBrowser_SearchItemInfo.hxx deleted file mode 100644 index b053275084..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchItemInfo.hxx +++ /dev/null @@ -1,62 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_SearchItemInfo_H -#define DFBrowser_SearchItemInfo_H - -#include -#include -#include -#include -#include - -//! \class DFBrowser_SearchItemInfo -//! Information of item in search model -class DFBrowser_SearchItemInfo -{ -public: - //! Constructor - DFBrowser_SearchItemInfo() {} - - //! Constructor - DFBrowser_SearchItemInfo(const QVariant& theIcon, - const QString& theName, - const QStringList& thePath, - const QString& theSeparator) - : myIcon(theIcon), - myPath(thePath) - { - myPathUnited = QString("%1 \n%2").arg(theName).arg(myPath.join(theSeparator)); - } - - //! Destructor - virtual ~DFBrowser_SearchItemInfo() {} - - //! Returns the item icon - const QVariant& Icon() const { return myIcon; } - - //! Returns path to the item. - const QStringList& Path() const { return myPath; } - - //! Returns united path to the item. - const QString& PathUnited() const { return myPathUnited; } - -private: - QVariant myIcon; //!< item icon - QStringList myPath; //!< item path - QString myPathUnited; //!< item name and item path -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_SearchLine.cxx b/tools/DFBrowser/DFBrowser_SearchLine.cxx deleted file mode 100644 index d7ba2bb6c4..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchLine.cxx +++ /dev/null @@ -1,191 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//! class DFBrowser_LineEdit -//! Extension of Qt line edit to visualize help text until the line edit control has not been filled -//! yet -class DFBrowser_LineEdit : public QLineEdit -{ -public: - //! Constructor - DFBrowser_LineEdit(QWidget* theParent) - : QLineEdit(theParent) - { - } - - //! Destructor - virtual ~DFBrowser_LineEdit() {} - - //! Sets text that is shown in line edit it the text of this control is empty - //! \param theText a string value - void setPlaneHolder(const QString& theText) { myPlaceHolder = theText; } - - //! Draws the line edit context, put plane holder if text is empty - //! \param theEvent a paint event - virtual void paintEvent(QPaintEvent* theEvent) Standard_OVERRIDE - { - QLineEdit::paintEvent(theEvent); - if (!text().isEmpty()) - return; - - QPainter aPainter(this); - QFontMetrics aFontMetrics = fontMetrics(); - QRect aLineRect = rect(); - Qt::Alignment anAlignment = QStyle::visualAlignment(layoutDirection(), Qt::AlignLeft); - - QColor aColor = Qt::gray; - QPen anOldpen = aPainter.pen(); - aPainter.setPen(aColor); - aLineRect.adjust(4, 4, 0, 0); - QString anElidedText = - aFontMetrics.elidedText(myPlaceHolder, Qt::ElideRight, aLineRect.width()); - aPainter.drawText(aLineRect, anAlignment, anElidedText); - aPainter.setPen(anOldpen); - } - -private: - QString myPlaceHolder; //!< text of filling line edit content if the text is empty -}; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_SearchLine::DFBrowser_SearchLine(QWidget* theParent) - : QFrame(theParent) -{ - QHBoxLayout* aLayout = new QHBoxLayout(this); - aLayout->setContentsMargins(0, 0, 0, 0); - aLayout->setSpacing(0); - - myLineControl = new DFBrowser_LineEdit(this); - ((DFBrowser_LineEdit*)myLineControl)->setPlaneHolder(QString(tr("Scanning application ..."))); - mySearchButton = new QToolButton(this); - mySearchButton->setIcon(QIcon(":/icons/search.png")); - - QCompleter* aCompleter = new QCompleter(this); - aCompleter->setCaseSensitivity(Qt::CaseInsensitive); - myLineControl->setCompleter(aCompleter); - - aLayout->addWidget(myLineControl); - aLayout->addWidget(mySearchButton); - - connect(myLineControl, - SIGNAL(textChanged(const QString&)), - this, - SLOT(onTextChanged(const QString&))); - connect(myLineControl, SIGNAL(returnPressed()), this, SLOT(onReturnPressed())); - connect(mySearchButton, SIGNAL(clicked()), this, SLOT(onSearchButtonClicked())); - - ViewControl_Tools::SetWhiteBackground(this); -} - -// ======================================================================= -// function : SetModule -// purpose : -// ======================================================================= -void DFBrowser_SearchLine::SetModule(DFBrowser_Module* theModule) -{ - DFBrowser_SearchLineModel* aModel = new DFBrowser_SearchLineModel(myLineControl, theModule); - myLineControl->completer()->setModel(aModel); -} - -// ======================================================================= -// function : GetModule -// purpose : -// ======================================================================= -DFBrowser_Module* DFBrowser_SearchLine::GetModule() -{ - DFBrowser_SearchLineModel* aModel = dynamic_cast(GetModel()); - return aModel->GetModule(); -} - -// ======================================================================= -// function : SetValues -// purpose : -// ======================================================================= -void DFBrowser_SearchLine::SetValues( - const QMap>& theDocumentValues, - const QMap& theDocumentInfoValues) -{ - DFBrowser_SearchLineModel* aModel = dynamic_cast(GetModel()); - aModel->SetValues(theDocumentValues, theDocumentInfoValues); - - QString aFirstValue = - !theDocumentInfoValues.empty() ? theDocumentInfoValues.begin().value().first() : ""; - DFBrowser_LineEdit* aLineEdit = dynamic_cast(myLineControl); - aLineEdit->setPlaneHolder(QString(tr("Search : %1")).arg(aFirstValue)); -} - -// ======================================================================= -// function : ClearValues -// purpose : -// ======================================================================= -void DFBrowser_SearchLine::ClearValues() -{ - DFBrowser_SearchLineModel* aModel = dynamic_cast(GetModel()); - aModel->ClearValues(); - - DFBrowser_LineEdit* aLineEdit = dynamic_cast(myLineControl); - aLineEdit->setPlaneHolder(QString(tr("Scanning application ..."))); -} - -// ======================================================================= -// function : onTextChanged -// purpose : -// ======================================================================= -void DFBrowser_SearchLine::onTextChanged(const QString& theText) -{ - mySearchButton->setIcon(theText.isEmpty() ? QIcon(":/icons/search.png") - : QIcon(":/icons/search_cancel.png")); - emit searchActivated(); -} - -// ======================================================================= -// function : onSearchButtonClicked -// purpose : -// ======================================================================= -void DFBrowser_SearchLine::onSearchButtonClicked() -{ - if (!Text().isEmpty()) - SetText(QString()); -} diff --git a/tools/DFBrowser/DFBrowser_SearchLine.hxx b/tools/DFBrowser/DFBrowser_SearchLine.hxx deleted file mode 100644 index 591ec28b62..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchLine.hxx +++ /dev/null @@ -1,103 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_SearchLine_H -#define DFBrowser_SearchLine_H - -#include // to include DFBrowser_SearchItemInfo - -#include -#include -#include - -#include -#include -#include -#include -#include - -class DFBrowser_Module; -class DFBrowser_SearchLineModel; - -class QAbstractItemModel; -class QLineEdit; -class QToolButton; -class QStringList; - -//! \class DFBrowser_SearchLine -//! It contains a line edit control with auto completion and search button -class DFBrowser_SearchLine : public QFrame -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_SearchLine(QWidget* theParent); - - //! Destructor - virtual ~DFBrowser_SearchLine() {} - - //! Creates search line model filled by the module. It is necessary for auto completion of line - //! edit \param theModule a current module - Standard_EXPORT void SetModule(DFBrowser_Module* theModule); - - //! Returns the current module - Standard_EXPORT DFBrowser_Module* GetModule(); - - //! Fills the search line model by OCAF document values - //! \param theDocumentValues container of document index to container of entry/attribute name to - //! item information \param theDocumentInfoValues container of a document index to entry/attribute - //! name - Standard_EXPORT void SetValues( - const QMap>& theDocumentValues, - const QMap& theDocumentInfoValues); - - //! Clears cache of values in search line model - Standard_EXPORT void ClearValues(); - - //! Returns completer model - QAbstractItemModel* GetModel() { return myLineControl->completer()->model(); } - - //! Returns completion completer model - QAbstractItemModel* GetCompletionModel() { return myLineControl->completer()->completionModel(); } - - //! Returns the current line edit text - QString Text() const { return myLineControl->text(); } - - //! Sets the current text value - //! \param theValue a string value - void SetText(const QString& theValue) { myLineControl->setText(theValue); } - -signals: - - //! Signals that is emitted by text changed in line edit control - void searchActivated(); - -private slots: - - //! Updates icon of search button depending on text is empty and emits searchActivated signal - void onTextChanged(const QString& theText); - - //! Sets completion prefix in completer model - void onReturnPressed() { myLineControl->completer()->setCompletionPrefix(myLineControl->text()); } - - //! Sets empty text if the current text is not empty: new search is started - void onSearchButtonClicked(); - -private: - QLineEdit* myLineControl; //!< line editor control - QToolButton* mySearchButton; //!< search button -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_SearchLineModel.cxx b/tools/DFBrowser/DFBrowser_SearchLineModel.cxx deleted file mode 100644 index 9062e9b1d0..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchLineModel.cxx +++ /dev/null @@ -1,213 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_SearchLineModel::DFBrowser_SearchLineModel(QObject* theParent, - DFBrowser_Module* theModule) - : QAbstractTableModel(theParent), - myModule(theModule), - myRowCount(0) -{ -} - -// ======================================================================= -// function : SetValues -// purpose : -// ======================================================================= -void DFBrowser_SearchLineModel::SetValues( - const QMap>& theDocumentValues, - const QMap& theDocumentInfoValues) -{ - myAdditionalValues = theDocumentValues; - myDocumentInfoValues = theDocumentInfoValues; - - myRowCount = 0; - for (QMap::const_iterator aValuesIt = myDocumentInfoValues.begin(); - aValuesIt != myDocumentInfoValues.end(); - aValuesIt++) - myRowCount += aValuesIt.value().size(); -} - -// ======================================================================= -// function : ClearValues -// purpose : -// ======================================================================= -void DFBrowser_SearchLineModel::ClearValues() -{ - myAdditionalValues.clear(); - myDocumentInfoValues.clear(); - myRowCount = 0; -} - -// ======================================================================= -// function : GetPath -// purpose : -// ======================================================================= -QStringList DFBrowser_SearchLineModel::GetPath(const QModelIndex& theIndex) const -{ - int aRowInDocument; - int aDocumentId = getDocumentId(theIndex.row(), aRowInDocument); - if (aDocumentId < 0) - return QStringList(); - - const QMap& anAdditionalValues = - myAdditionalValues[aDocumentId]; - const QStringList& anInfoValues = myDocumentInfoValues[aDocumentId]; - - return anAdditionalValues[anInfoValues[aRowInDocument]].Path(); -} - -// ======================================================================= -// function : GetValue -// purpose : -// ======================================================================= -QString DFBrowser_SearchLineModel::GetValue(const QModelIndex& theIndex) const -{ - int aRowInDocument; - int aDocumentId = getDocumentId(theIndex.row(), aRowInDocument); - if (aDocumentId < 0) - return QString(); - QString aValue = myDocumentInfoValues[aDocumentId][aRowInDocument]; - return aValue.mid(0, aValue.indexOf(SplitSeparator())); -} - -// ======================================================================= -// function : index -// purpose : -// ======================================================================= -QModelIndex DFBrowser_SearchLineModel::index(int theRow, - int theColumn, - const QModelIndex& theParent) const -{ - if (!hasIndex(theRow, theColumn, theParent)) - return QModelIndex(); - return createIndex(theRow, theColumn); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowser_SearchLineModel::data(const QModelIndex& theIndex, int theRole) const -{ - switch (theIndex.column()) - { - case 0: { - if (theRole == Qt::DisplayRole || theRole == Qt::EditRole || theRole == Qt::ToolTipRole) - { - int aRowInDocument; - int aDocumentId = getDocumentId(theIndex.row(), aRowInDocument); - if (aDocumentId < 0) - return QVariant(); - return myDocumentInfoValues[aDocumentId][aRowInDocument]; - } - break; - } - case 1: { - if (theRole == Qt::DecorationRole) - { - int aRowInDocument; - int aDocumentId = getDocumentId(theIndex.row(), aRowInDocument); - if (aDocumentId < 0) - return QVariant(); - QString anInfoValue = myDocumentInfoValues[aDocumentId][aRowInDocument]; - QVariant anIcon = myAdditionalValues[aDocumentId][anInfoValue].Icon(); - if (anIcon.isNull()) - { - QString anAttributeName = anInfoValue.mid(0, anInfoValue.indexOf(SplitSeparator())); - anIcon = DFBrowser_Module::GetAttributeInfo(anAttributeName.toUtf8().data(), - myModule, - DFBrowserPane_ItemRole_Decoration_40x40, - 0); - } - else - anIcon = DFBrowser_Tools::GetLabelIcon(TDF_Label(), false); - return anIcon; - } - if (theRole == Qt::SizeHintRole) - return QSize(80, 80); - break; - } - case 2: { - if (theRole == Qt::DisplayRole || theRole == Qt::EditRole) - { - int aRowInDocument; - int aDocumentId = getDocumentId(theIndex.row(), aRowInDocument); - if (aDocumentId < 0) - return QVariant(); - QString anInfoValue = myDocumentInfoValues[aDocumentId][aRowInDocument]; - return myAdditionalValues[aDocumentId][anInfoValue].PathUnited(); - } - break; - } - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : emitLayoutChanged -// purpose : -// ======================================================================= -void DFBrowser_SearchLineModel::EmitLayoutChanged() -{ - emit layoutChanged(); -} - -// ======================================================================= -// function : getDocumentId -// purpose : -// ======================================================================= -int DFBrowser_SearchLineModel::getDocumentId(const int theRow, int& theRowInDocument) const -{ - theRowInDocument = 0; - int aDocumentId = -1; - - int aCurrentRow = theRow; - for (int aValueId = 0, aSize = myDocumentInfoValues.size(); aValueId < aSize; aValueId++) - { - int aValueIndex = aValueId + 1; - if (!myDocumentInfoValues.contains(aValueIndex)) - continue; - QStringList aValues = myDocumentInfoValues[aValueIndex]; - int aValuesSize = aValues.size(); - if (aCurrentRow < aValuesSize) - { - aDocumentId = aValueIndex; - theRowInDocument = aCurrentRow; - } - else - aCurrentRow = aCurrentRow - aValuesSize; - } - return aDocumentId; -} diff --git a/tools/DFBrowser/DFBrowser_SearchLineModel.hxx b/tools/DFBrowser/DFBrowser_SearchLineModel.hxx deleted file mode 100644 index 269277390a..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchLineModel.hxx +++ /dev/null @@ -1,129 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_SearchLineModel_H -#define DFBrowser_SearchLineModel_H - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -class QObject; -class DFBrowser_Module; - -//! \class DFBrowser_SearchLineModel -//! Table view model filled by OCAF labels and attributes. It contain information in the next form: -//! into -//! is key(attribute name or label entry) into item information -//! The model contains 3 columns: -//! - 0: information text -//! - 1: icon size is [80, 80] -//! - 2: information text that contains united path -class DFBrowser_SearchLineModel : public QAbstractTableModel -{ -public: - //! Constructor - Standard_EXPORT DFBrowser_SearchLineModel(QObject* theParent, DFBrowser_Module* theModule); - - //! Destructor - virtual ~DFBrowser_SearchLineModel() {} - - //! Separator as attribute name is divided from the label entry in information text - static QString SplitSeparator() { return ": "; } - - //! Returns the current module - DFBrowser_Module* GetModule() const { return myModule; } - - //! Fills internal containers by the OCAF values. Updates number of rows value - //! \param theDocumentValues container of document index to container of entry/attribute name to - //! item information \param theDocumentInfoValues container of a document index to entry/attribute - //! name - Standard_EXPORT void SetValues( - const QMap>& theDocumentValues, - const QMap& theDocumentInfoValues); - - //! Clears cache of values - Standard_EXPORT void ClearValues(); - - //! Returns path to attribute or label element of OCAF by the index. - //! \param theIndex a tree model index - Standard_EXPORT QStringList GetPath(const QModelIndex& theIndex) const; - - //! Returns value(attribute name or label entry) of OCAF by the index - Standard_EXPORT QString GetValue(const QModelIndex& theIndex) const; - - //! Emits the layoutChanged signal from outside of this class - Standard_EXPORT void EmitLayoutChanged(); - - //! Creates new model index - //! \param theRow the index row position - //! \param theColummn the index column position - //! \param theParent the parent index - //! \return the model index - Standard_EXPORT virtual QModelIndex index(int theRow, - int theColumn, - const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns the data stored under the given role for the item referred to by the index. - //! \param theIndex a model index - //! \param theRole an enumeration value of role for data obtaining - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns the number of rows under the given parent. - //! \param theParent a parent model index - //! \return the number of rows - - virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return myRowCount; - } - - //! Returns the number of columns for the children of the given parent. - //! \param theParent a parent model index - //! \return the number of columns - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 3; - } - -protected: - //! Returns document index by a row index in table model - //! \param theRow a row index of a QModelIndex - //! \param theRowInDocument an output index, to obtain information from myDocumentInfoValues - int getDocumentId(const int theRow, int& theRowInDocument) const; - -private: - DFBrowser_Module* - myModule; //!< the current module - //! a document index to container of entry/attribute name to item information - QMap> myAdditionalValues; - QMap myDocumentInfoValues; //!< a document index to entry/attribute name - int myRowCount; //!< number of rows in the model: summ of row counts in all documents -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_SearchView.cxx b/tools/DFBrowser/DFBrowser_SearchView.cxx deleted file mode 100644 index 782246a20c..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchView.cxx +++ /dev/null @@ -1,133 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -static const int DEFAULT_ICON_SIZE = 40; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_SearchView::DFBrowser_SearchView(QWidget* theParent) - : QObject(theParent) -{ - myMainWindow = new QWidget(theParent); - QGridLayout* aLayout = new QGridLayout(myMainWindow); - aLayout->setContentsMargins(0, 0, 0, 0); - - myTableView = new QTableView(myMainWindow); - myTableView->verticalHeader()->setVisible(false); - myTableView->verticalHeader()->setDefaultSectionSize(DEFAULT_ICON_SIZE - + TreeModel_Tools::HeaderSectionMargin()); - myTableView->setIconSize(QSize(DEFAULT_ICON_SIZE, DEFAULT_ICON_SIZE)); - myTableView->horizontalHeader()->setVisible(false); - myTableView->horizontalHeader()->setStretchLastSection(true); - - myTableView->viewport()->setAttribute(Qt::WA_Hover); - myTableView->setItemDelegate(new DFBrowser_HighlightDelegate(myTableView)); - - aLayout->addWidget(myTableView); - - ViewControl_Tools::SetWhiteBackground(myTableView); - myTableView->setGridStyle(Qt::NoPen); -} - -// ======================================================================= -// function : InitModels -// purpose : -// ======================================================================= -void DFBrowser_SearchView::InitModels() -{ - QAbstractItemModel* aModel = mySearchLine->GetCompletionModel(); - myTableView->setModel(aModel); - myTableView->setColumnWidth(0, 0); // to hide column - myTableView->setColumnWidth(1, DEFAULT_ICON_SIZE + TreeModel_Tools::HeaderSectionMargin()); - - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(aModel); - myTableView->setSelectionMode(QAbstractItemView::SingleSelection); - myTableView->setSelectionModel(aSelectionModel); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&))); - connect(myTableView, - SIGNAL(doubleClicked(const QModelIndex&)), - this, - SLOT(onTableDoubleClicked(const QModelIndex&))); -} - -// ======================================================================= -// function : onTableSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_SearchView::onTableSelectionChanged(const QItemSelection&, const QItemSelection&) -{ - QItemSelectionModel* aSelectionModel = myTableView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected(aSelectedIndices, 2); - if (!aSelectedIndex.isValid()) - return; - QAbstractProxyModel* aTableModel = dynamic_cast(myTableView->model()); - if (!aTableModel) - return; - DFBrowser_SearchLineModel* aSourceModel = - dynamic_cast(aTableModel->sourceModel()); - if (!aSourceModel) - return; - - QModelIndex aSourceSelectedIndex = aTableModel->mapToSource(aSelectedIndex); - emit pathSelected(aSourceModel->GetPath(aSourceSelectedIndex), - aSourceModel->GetValue(aSourceSelectedIndex)); -} - -// ======================================================================= -// function : onTableDoubleClicked -// purpose : -// ======================================================================= -void DFBrowser_SearchView::onTableDoubleClicked(const QModelIndex& theIndex) -{ - QAbstractProxyModel* aTableModel = dynamic_cast(myTableView->model()); - if (!aTableModel) - return; - DFBrowser_SearchLineModel* aSourceModel = - dynamic_cast(aTableModel->sourceModel()); - if (!aSourceModel) - return; - - QModelIndex aSourceSelectedIndex = aTableModel->mapToSource(theIndex); - emit pathDoubleClicked(aSourceModel->GetPath(aSourceSelectedIndex), - aSourceModel->GetValue(aSourceSelectedIndex)); -} diff --git a/tools/DFBrowser/DFBrowser_SearchView.hxx b/tools/DFBrowser/DFBrowser_SearchView.hxx deleted file mode 100644 index 2dd0281a6e..0000000000 --- a/tools/DFBrowser/DFBrowser_SearchView.hxx +++ /dev/null @@ -1,88 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_SearchView_H -#define DFBrowser_SearchView_H - -#include -#include - -#include - -#include -#include -#include -#include - -class DFBrowser_SearchLine; -class QTableView; -class QWidget; - -//! \class DFBrowser_SearchView -//! Container of search result. It has a table of values -class DFBrowser_SearchView : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_SearchView(QWidget* theParent); - - //! Destructor - virtual ~DFBrowser_SearchView() {} - - //! Returns search parent control - QWidget* GetControl() const { return myMainWindow; } - - //! Sets search line to connect to the search line completion model - void SetSearchLine(DFBrowser_SearchLine* theSearchLine) { mySearchLine = theSearchLine; } - - //! Fills the table by values of search line completion model. The zero column of the table is - //! hidden, so it visualizes values of 1st and 2nd columns of this model. It creates selection - //! model and connects to selectionChanged and doubleClicked signals - Standard_EXPORT void InitModels(); - - //! Resets search line - void Reset() { mySearchLine->SetText(""); } - -signals: - - //! Signal about selecting of an item in the view. - //! \param thePath path to the selected item (e.g. 0, 0:1, 0:1:1) - //! \param theValue value of the selected item (e.g. TDataStd_Name) - void pathSelected(const QStringList& thePath, const QString& theValue); - - //! Signal about double click on an item in the view. - //! \param thePath path to the selected item (e.g. 0, 0:1, 0:1:1) - //! \param theValue value of the selected item (e.g. TDataStd_Name) - void pathDoubleClicked(const QStringList& thePath, const QString& theValue); - -protected slots: - - //! Listens selection change and emits the pathSelected signal - //! \param theSelected selected items - //! \param theDeselected deselected items - void onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Listens double click signal on table view - //! \theIndex a model index of double clicked item - void onTableDoubleClicked(const QModelIndex& theIndex); - -private: - QWidget* myMainWindow; //!< control where table view is placed - QTableView* myTableView; //!< table view to visualize search values - DFBrowser_SearchLine* mySearchLine; //!< search line to have access to search model completor -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_Tools.cxx b/tools/DFBrowser/DFBrowser_Tools.cxx deleted file mode 100644 index 13b6afaef5..0000000000 --- a/tools/DFBrowser/DFBrowser_Tools.cxx +++ /dev/null @@ -1,105 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace DFBrowser_Tools -{ -// ======================================================================= -// function : IsEmptyLabel -// purpose : -// ======================================================================= -bool IsEmptyLabel(const TDF_Label& theLabel) -{ - if (theLabel.IsNull()) - return true; - - if (theLabel.IsRoot()) - return false; - - if (theLabel.NbAttributes() > 0) - return false; - - for (TDF_ChildIterator aChildIt(theLabel); aChildIt.More(); aChildIt.Next()) - { - if (!IsEmptyLabel(aChildIt.Value())) - return false; - } - return true; -} - -// ======================================================================= -// function : GetLabelInfo -// purpose : -// ======================================================================= -QString GetLabelInfo(const TDF_Label& theLabel, const bool isUseShortInfo) -{ - QString aValue = DFBrowserPane_Tools::GetEntry(theLabel).ToCString(); - if (!isUseShortInfo) - return aValue; - - Handle(TDataStd_Name) aName; - if (!theLabel.FindAttribute(TDataStd_Name::GetID(), aName)) - return aValue; - - aValue += " "; - aValue += DFBrowserPane_Tools::ToString(aName->Get()); - - return aValue; -} - -enum DFBrowser_IconType -{ - DFBrowser_IconType_16x16, - DFBrowser_IconType_40x40 -}; - -static QMap MyLabelIcons; - -// ======================================================================= -// function : GetLabelIcon -// purpose : -// ======================================================================= -QIcon GetLabelIcon(const TDF_Label& theLabel, bool isStandard16x16) -{ - (void)theLabel; - if (MyLabelIcons.empty()) - { - MyLabelIcons[DFBrowser_IconType_16x16] = QIcon(":/icons/label_folder_16x16.png"); - MyLabelIcons[DFBrowser_IconType_40x40] = QIcon(":/icons/label_folder_40x40.png"); - } - return MyLabelIcons[isStandard16x16 ? DFBrowser_IconType_16x16 : DFBrowser_IconType_40x40]; -} -} // namespace DFBrowser_Tools diff --git a/tools/DFBrowser/DFBrowser_Tools.hxx b/tools/DFBrowser/DFBrowser_Tools.hxx deleted file mode 100644 index 254313b730..0000000000 --- a/tools/DFBrowser/DFBrowser_Tools.hxx +++ /dev/null @@ -1,59 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_Tools_H -#define DFBrowser_Tools_H - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class DFBrowserPane_AttributePaneAPI; - -//! \namespace DFBrowser_Tools -//! The namespace that gives auxiliary methods for TDF elements manipulation -namespace DFBrowser_Tools -{ - -//! Returns true if the label is not root, has attribute or at least one sub-label with attribute -//! \param theLabel a label -//! \return boolean result -Standard_EXPORT bool IsEmptyLabel(const TDF_Label& theLabel); - -//! Returns the label entry -//! \param isUseShortInfo boolean value if value of name attribute should be included to result -//! \return string value -Standard_EXPORT QString GetLabelInfo(const TDF_Label& theLabel, const bool isUseShortInfo = true); - -//! Returns the label icon -Standard_EXPORT QIcon GetLabelIcon(const TDF_Label& theLabel, bool isStandard16x16 = true); -} // namespace DFBrowser_Tools - -#endif diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx b/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx deleted file mode 100644 index 6c245c9b6b..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelLine.cxx +++ /dev/null @@ -1,263 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int HISTORY_SIZE = 10; -const int MARGIN_SIZE = 2; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_TreeLevelLine::DFBrowser_TreeLevelLine(QWidget* theParent) - : QObject(theParent), - mySelectionProcessingBlocked(false), - myCurrentHistoryIndex(-1) -{ - myMainWindow = new QWidget(theParent); - QGridLayout* aLayout = new QGridLayout(myMainWindow); - aLayout->setContentsMargins(MARGIN_SIZE, MARGIN_SIZE, MARGIN_SIZE, MARGIN_SIZE); - - myBackwardButton = new QToolButton(myMainWindow); - myBackwardButton->setIcon(QIcon(":/icons/treeline_backward.png")); - myBackwardButton->setToolTip(tr("Backward")); - connect(myBackwardButton, SIGNAL(clicked()), this, SLOT(onActionClicked())); - aLayout->addWidget(myBackwardButton, 0, 0); - - myForwardButton = new QToolButton(myMainWindow); - myForwardButton->setIcon(QIcon(":/icons/treeline_forward.png")); - myForwardButton->setToolTip(tr("Forward")); - connect(myForwardButton, SIGNAL(clicked()), this, SLOT(onActionClicked())); - aLayout->addWidget(myForwardButton, 0, 1); - - myTableView = new QTableView(myMainWindow); - myTableView->horizontalHeader()->setVisible(false); - QHeaderView* aVHeader = myTableView->verticalHeader(); - aVHeader->setVisible(false); - int aDefCellSize = aVHeader->minimumSectionSize() + TreeModel_Tools::HeaderSectionMargin(); - aVHeader->setDefaultSectionSize(aDefCellSize); - aLayout->addWidget(myTableView, 0, 2); - - myTableView->setFixedHeight(aDefCellSize); - myTableView->horizontalHeader()->setMinimumSectionSize(5); // it will be resized by context - myTableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem); - myTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //! TEMPORARY - myTableView->setShowGrid(false); - - DFBrowser_TreeLevelLineModel* aHModel = new DFBrowser_TreeLevelLineModel(myTableView); - myTableView->setModel(aHModel); - - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(aHModel); - myTableView->setSelectionMode(QAbstractItemView::SingleSelection); - myTableView->setSelectionModel(aSelectionModel); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&))); - - // highlight for items - myTableView->viewport()->setAttribute(Qt::WA_Hover); - myTableView->setItemDelegate(new DFBrowser_TreeLevelLineDelegate(myTableView)); - - aLayout->setColumnStretch(2, 1); - - myUpdateButton = new QToolButton(myMainWindow); - myUpdateButton->setIcon(QIcon(":/icons/treeline_update.png")); - myUpdateButton->setToolTip(tr("Update Tree Model")); - connect(myUpdateButton, SIGNAL(clicked()), this, SLOT(onActionClicked())); - aLayout->addWidget(myUpdateButton, 0, 3); - - mySearchLine = new DFBrowser_SearchLine(myMainWindow); - aLayout->addWidget(mySearchLine, 0, 4); - - updateActionsState(); -} - -// ======================================================================= -// function : clear -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::ClearHistory() -{ - myHistoryIndices.clear(); - setCurrentHistoryIndex(-1); -} - -// ======================================================================= -// function : onSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::OnTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - QModelIndexList aSelectedIndices = theSelected.indexes(); - QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected(aSelectedIndices, 0); - - if (!mySelectionProcessingBlocked) // we're processing action click - setForwardIndex(aSelectedIndex); - - bool isBlocked = mySelectionProcessingBlocked; - // block selection processing in order to avoid circling by processing table selection changing - mySelectionProcessingBlocked = true; - DFBrowser_TreeLevelLineModel* aModel = - dynamic_cast(myTableView->model()); - aModel->Init(aSelectedIndex); - myTableView->selectionModel()->clearSelection(); - myTableView->resizeColumnsToContents(); - - myTableView->scrollTo(myTableView->model()->index(0, myTableView->model()->columnCount() - 1)); - - mySelectionProcessingBlocked = isBlocked; -} - -// ======================================================================= -// function : onTableSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - if (mySelectionProcessingBlocked) - return; - - DFBrowser_TreeLevelLineModel* aTableModel = - dynamic_cast(myTableView->model()); - if (!aTableModel) - return; - - QModelIndex aSelectedIndex = - TreeModel_ModelBase::SingleSelected(theSelected.indexes(), 0, Qt::Vertical); - emit indexSelected(aTableModel->GetTreeViewIndex(aSelectedIndex)); -} - -// ======================================================================= -// function : onActionClicked -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::onActionClicked() -{ - QToolButton* aSender = (QToolButton*)sender(); - if (aSender == myBackwardButton || aSender == myForwardButton) - { - bool aBlocked = mySelectionProcessingBlocked; - mySelectionProcessingBlocked = true; - QModelIndex anIndex; - if (aSender == myBackwardButton) - { - anIndex = getBackwardIndex(); - if (anIndex.isValid()) - setCurrentHistoryIndex(myCurrentHistoryIndex - 1); - } - else - { - anIndex = getForwardIndex(); - if (anIndex.isValid()) - setCurrentHistoryIndex(myCurrentHistoryIndex + 1); - } - if (anIndex.isValid()) - emit indexSelected(anIndex); - mySelectionProcessingBlocked = aBlocked; - } - else if (aSender == myUpdateButton) - emit updateClicked(); -} - -// ======================================================================= -// function : getBackwardIndex -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeLevelLine::getBackwardIndex() -{ - return myCurrentHistoryIndex > 0 ? myHistoryIndices[myCurrentHistoryIndex - 1] : QModelIndex(); -} - -// ======================================================================= -// function : getForwardIndex -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeLevelLine::getForwardIndex() -{ - return (myCurrentHistoryIndex >= 0 && myCurrentHistoryIndex + 1 < myHistoryIndices.count()) - ? myHistoryIndices[myCurrentHistoryIndex + 1] - : QModelIndex(); -} - -// ======================================================================= -// function : setForwardIndex -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::setForwardIndex(const QModelIndex& theIndex) -{ - while (myCurrentHistoryIndex != myHistoryIndices.count() - 1) - myHistoryIndices.removeLast(); - - myHistoryIndices.append(theIndex); - if (myHistoryIndices.size() > HISTORY_SIZE) - myHistoryIndices.removeFirst(); - - setCurrentHistoryIndex(myHistoryIndices.count() - 1); -} - -// ======================================================================= -// function : setCurrentHistoryIndex -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::setCurrentHistoryIndex(const int theIndexId) -{ - myCurrentHistoryIndex = theIndexId; - updateActionsState(); -} - -// ======================================================================= -// function : updateActionsState -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLine::updateActionsState() -{ - if (myCurrentHistoryIndex < 0) - { - myBackwardButton->setEnabled(false); - myForwardButton->setEnabled(false); - } - else - { - myBackwardButton->setEnabled(myCurrentHistoryIndex > 0); - myForwardButton->setEnabled(myCurrentHistoryIndex < myHistoryIndices.size() - 1); - } -} diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLine.hxx b/tools/DFBrowser/DFBrowser_TreeLevelLine.hxx deleted file mode 100644 index 21273d42a1..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelLine.hxx +++ /dev/null @@ -1,133 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_TreeLevelLine_H -#define DFBrowser_TreeLevelLine_H - -#include - -#include - -#include -#include -#include -#include -#include -#include - -class DFBrowser_SearchLine; - -class QAbstractItemModel; -class QToolButton; -class QTableView; -class QWidget; - -//! \class DFBrowser_TreeLevelLine -//! This is a control to visualize the current selected item of OCAF tree view. -//! It contains history of previous selected items. -//! The structure of this control is the next: -//! -//! - allows moving to previously selected item (if it exists) -//! - allows moving to next selected item (if it exists) -//! - path to currently selected item in OCAF tree view. Click on any level -//! will select the clicked item in tree view. -//! - will update content of OCAF tree model -//! - allows type label entry or attribute name and see in search view the available -//! elements -class DFBrowser_TreeLevelLine : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_TreeLevelLine(QWidget* theParent); - - //! Destructor - virtual ~DFBrowser_TreeLevelLine() {} - - //! Clears history of selected items - Standard_EXPORT void ClearHistory(); - - //! Returns parent control - QWidget* GetControl() const { return myMainWindow; } - - //! Returns current search line - DFBrowser_SearchLine* GetSearchLine() const { return mySearchLine; }; - -signals: - - //! Signal about selection of an item in tree level line - //! \param theIndex a tree view model index of selected item - void indexSelected(const QModelIndex& theIndex); - - //! Signal about necessity to update OCAF tree model - void updateClicked(); - -public slots: - - //! Listens tree view selection model. Update tree level line by selected item. Stores - //! \param theSelected a list of selected items - //! \param theDeselected a list of deselected items - Standard_EXPORT void OnTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -private slots: - - //! Listens table view selection model. Gets selected tree view model index and emit indexSelected - //! signal. \param theSelected a list of selected items \param theDeselected a list of deselected - //! items - void onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Listens actions and do the following: - //! - : moves history to the previous selection item, emits indexSelected signal - //! - : moves history to the next selection item, emits indexSelected signal - //! - : emits updateClicked signal to update OCAF tree model - void onActionClicked(); - -private: - //! Returns the previous index of history selection - QModelIndex getBackwardIndex(); - - //! Returns the next index of history selection - QModelIndex getForwardIndex(); - - //! Appends new history index, set it active, remove the first history index if the cache is out - //! of range \param theIndex a selected OCAF tree model index - void setForwardIndex(const QModelIndex& theIndex); - - //! Updates enable state of backward/forward actions depending on the current item index - void updateActionsState(); - - //! Sets the current index and update actions state - //! \param theIndexId an item index, should be in range of history of indices - void setCurrentHistoryIndex(const int theIndexId); - -private: - bool mySelectionProcessingBlocked; //!< if true, table view selection is started but has not been - //!< finished yet - QList myHistoryIndices; //!< cached selected OCAF tree model indices - int - myCurrentHistoryIndex; //!< an index of the current history selected index from myHistoryIndices - - QWidget* myMainWindow; //!< parent widget for controls - QToolButton* myBackwardButton; //!< backward button, to select previous selected item - QToolButton* myForwardButton; //!< forward button, to select next selected item - QToolButton* myUpdateButton; //!< update button, like F5, to update OCAF tree model content - QTableView* - myTableView; //!< container of path values to selected item, a path value is a label entry - - DFBrowser_SearchLine* mySearchLine; //!< line of search -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx b/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx deleted file mode 100644 index 3d28d64f44..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.cxx +++ /dev/null @@ -1,57 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_TreeLevelLineDelegate::DFBrowser_TreeLevelLineDelegate(QObject* theParent) - : QItemDelegate(theParent) -{ -} - -// ======================================================================= -// function : paint -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLineDelegate::paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const -{ - // highlight cell - if (theOption.state & QStyle::State_MouseOver) - thePainter->fillRect(theOption.rect, DFBrowserPane_Tools::LightHighlightColor()); - - // action icon for all indices before the last one - if (theIndex.column() < theIndex.model()->columnCount() - 1) - { - QIcon anIcon(":/icons/level_change.png"); - QSize anIconSize(10, 20); - thePainter->drawPixmap(QRect(theOption.rect.right() - anIconSize.width(), - theOption.rect.top(), - anIconSize.width(), - anIconSize.height()), - anIcon.pixmap(anIconSize.width(), anIconSize.height())); - } - // default paint - QItemDelegate::paint(thePainter, theOption, theIndex); -} diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.hxx b/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.hxx deleted file mode 100644 index c73bab4bcb..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.hxx +++ /dev/null @@ -1,49 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_TreeLevelLineDelegate_H -#define DFBrowser_TreeLevelLineDelegate_H - -#include -#include - -#include -#include -#include - -//! \class DFBrowser_TreeLevelLineDelegate -//! Extending standard item delegate by: -//! - icon. It exists for all columns excepting the last column. -//! - highlight cell by mouse move over the cell -class DFBrowser_TreeLevelLineDelegate : public QItemDelegate -{ - -public: - //! Constructor - Standard_EXPORT DFBrowser_TreeLevelLineDelegate(QObject* theParent = 0); - - //! Destructor - virtual ~DFBrowser_TreeLevelLineDelegate() {} - - //! Draws an icon in the cell and highlight cell if mouse is over the cell - //! \param thePainter a painter - //! \param theOption a paint options - //! \param theIndex a view index - Standard_EXPORT virtual void paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const Standard_OVERRIDE; -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLineModel.cxx b/tools/DFBrowser/DFBrowser_TreeLevelLineModel.cxx deleted file mode 100644 index d9046ce652..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelLineModel.cxx +++ /dev/null @@ -1,100 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelLineModel::Init(const QModelIndex& theTreeIndex) -{ - myTreeIndex = theTreeIndex; - myLevelItems.clear(); - - if (theTreeIndex.isValid()) - { - myLevelItems.prepend(theTreeIndex); - QModelIndex aParent = theTreeIndex.parent(); - while (aParent.isValid()) - { - myLevelItems.prepend(aParent); - aParent = aParent.parent(); - } - } - emit layoutChanged(); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowser_TreeLevelLineModel::data(const QModelIndex& theIndex, int theRole) const -{ - QVariant aValue; - int aColumns = theIndex.column(); - if (aColumns < myLevelItems.size()) - { - QModelIndex aTreeIndex = myLevelItems[aColumns]; - if (theRole == Qt::DecorationRole) //! do not show icons presented in tree view - return aValue; - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(aTreeIndex); - if (!anItemBase) - return aValue; - - DFBrowser_ItemBasePtr aDBrowserItem = itemDynamicCast(anItemBase); - if (!aDBrowserItem) - return aValue; - - bool aPrevValue = aDBrowserItem->SetUseAdditionalInfo(false); - aValue = aDBrowserItem->data(aTreeIndex, theRole); - aDBrowserItem->SetUseAdditionalInfo(aPrevValue); - - if (theRole == Qt::DisplayRole) - aValue = aValue.toString() + " "; //! TEMPORARY to leave place for the action icon - } - return aValue; -} - -// ======================================================================= -// function : headerData -// purpose : -// ======================================================================= -QVariant DFBrowser_TreeLevelLineModel::headerData(int theSection, - Qt::Orientation theOrientation, - int theRole) const -{ - QVariant aValue; - if (theOrientation == Qt::Horizontal && theSection < myLevelItems.size()) - { - QModelIndex aTreeIndex = myLevelItems[theSection]; - if (!aTreeIndex.isValid()) // level change action - { - if (theRole == Qt::SizeHintRole) - aValue = QSize(2, 2); - else if (theRole == Qt::DisplayRole) - aValue = ""; - } - } - return aValue; -} diff --git a/tools/DFBrowser/DFBrowser_TreeLevelLineModel.hxx b/tools/DFBrowser/DFBrowser_TreeLevelLineModel.hxx deleted file mode 100644 index 5380add71f..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelLineModel.hxx +++ /dev/null @@ -1,100 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_TreeLevelLineModel_H -#define DFBrowser_TreeLevelLineModel_H - -#include - -#include - -#include -#include -#include -#include -#include - -//! \class DFBrowser_TreeLevelLineModel -//! Tree Model of tree line items. It is initialized by OCAF tree model index. Each element of the -//! current model is an item of hierarchy of OCAF tree model index. So, on each level a label is -//! presented, the last element may be an attribute. Information, presented for the item has no -//! additional information (not as in OCAF tree model) -class DFBrowser_TreeLevelLineModel : public QAbstractTableModel -{ -public: - //! Constructor - DFBrowser_TreeLevelLineModel(QObject* theParent = 0) - : QAbstractTableModel(theParent) - { - } - - //! Destructor - virtual ~DFBrowser_TreeLevelLineModel() {} - - //! Resets the cached values - void Reset() { myLevelItems.clear(); } - - //! Inits the model by the index - //! \param theTreeIndex an OCAF tree model index - Standard_EXPORT void Init(const QModelIndex& theTreeIndex); - - //! Returns true if the tree model index is filled - bool IsInitialized() const { return myTreeIndex.isValid(); } - - //! Returns OCAF tree view model index on level defined by column of the parameter index - //! \param theIndex a tree level view model index - //! \return model index - const QModelIndex& GetTreeViewIndex(const QModelIndex& theIndex) const - { - return myLevelItems[theIndex.column()]; - } - - //! Returns item information(short) for display role. - //! \param theIndex a model index - //! \param theRole a view role - //! \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns the header data for the given role and section in the header with the specified - //! orientation. \param theSection the header section. For horizontal headers - column number, for - //! vertical headers - row number. \param theOrientation a header orientation \param theRole a - //! data role \return the header data - Standard_EXPORT virtual QVariant headerData(int theSection, - Qt::Orientation theOrientation, - int theRole = Qt::DisplayRole) const - Standard_OVERRIDE; - - //! Returns number of tree level line items = columns in table view - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return myLevelItems.size(); - } - - //! Returns only one row in table view - virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 1; - } - -private: - QModelIndex myTreeIndex; //!< the current OCAF tree view model index - QList - myLevelItems; //!< cached parent indices of myTreeIndex for quick access to item information -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_TreeLevelView.cxx b/tools/DFBrowser/DFBrowser_TreeLevelView.cxx deleted file mode 100644 index bc11d05d6e..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelView.cxx +++ /dev/null @@ -1,167 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -const int LABEL_OR_ATTRIBUTECOLUMN_WIDTH = 160; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_TreeLevelView::DFBrowser_TreeLevelView(QWidget* theParent) - : QObject(theParent) -{ - myMainWindow = new QWidget(theParent); - QGridLayout* aLayout = new QGridLayout(myMainWindow); - aLayout->setContentsMargins(0, 0, 0, 0); - - myTableView = new QTableView(myMainWindow); - myTableView->setModel(new DFBrowser_TreeLevelViewModel(myTableView)); - myTableView->setColumnWidth(0, LABEL_OR_ATTRIBUTECOLUMN_WIDTH); - myTableView->setEditTriggers(QAbstractItemView::DoubleClicked); - myTableView->horizontalHeader()->setVisible(false); - QHeaderView* aVHeader = myTableView->verticalHeader(); - aVHeader->setVisible(false); - aVHeader->setDefaultSectionSize(aVHeader->minimumSectionSize()); - myTableView->horizontalHeader()->setStretchLastSection(true); - aLayout->addWidget(myTableView); - - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(myTableView->model()); - myTableView->setSelectionMode(QAbstractItemView::SingleSelection); - myTableView->setSelectionModel(aSelectionModel); - myTableView->setSelectionBehavior(QAbstractItemView::SelectRows); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&))); - connect(myTableView, - SIGNAL(doubleClicked(const QModelIndex&)), - this, - SLOT(onTableDoubleClicked(const QModelIndex&))); - - ViewControl_Tools::SetWhiteBackground(myTableView); - myTableView->setGridStyle(Qt::NoPen); -} - -// ======================================================================= -// function : clearSelection -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelView::ClearSelection() -{ - myTableView->selectionModel()->clearSelection(); -} - -// ======================================================================= -// function : ProcessItem -// purpose : -// ======================================================================= -bool DFBrowser_TreeLevelView::ProcessItem(const QModelIndex& theIndex) -{ - bool aResult = false; - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(theIndex); - if (anItemBase) - { - // use this view for attribute/document/label items - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - if (anItem) - aResult = anItem && !anItem->HasAttribute(); - else - aResult = true; // attribute or document item - } - return aResult; -} - -// ======================================================================= -// function : UpdateByTreeSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelView::UpdateByTreeSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - QModelIndexList aSelectedIndices = theSelected.indexes(); - QModelIndexList aFirstColumnSelectedIndices; - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() == 0) - aFirstColumnSelectedIndices.append(anIndex); - } - - if (aFirstColumnSelectedIndices.size() != 1) - return; - - DFBrowser_TreeLevelViewModel* aModel = - dynamic_cast(myTableView->model()); - const QModelIndex& anIndex = aFirstColumnSelectedIndices.first(); - if (DFBrowser_TreeLevelView::ProcessItem(anIndex)) // to Init - aModel->Init(anIndex); - else - aModel->Reset(); -} - -// ======================================================================= -// function : onTableSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelView::onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - QModelIndexList aSelectedIndices = theSelected.indexes(); - QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected(aSelectedIndices, 0); - - DFBrowser_TreeLevelViewModel* aTableModel = - dynamic_cast(myTableView->model()); - if (aTableModel && aTableModel->IsInitialized()) - { - const QModelIndex& aTreeViewIndex = aTableModel->GetTreeViewIndex(aSelectedIndex); - if (aTreeViewIndex.isValid()) - emit indexSelected(aTreeViewIndex); - } -} - -// ======================================================================= -// function : onTableDoubleClicked -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelView::onTableDoubleClicked(const QModelIndex& theIndex) -{ - DFBrowser_TreeLevelViewModel* aTableModel = - dynamic_cast(myTableView->model()); - if (!aTableModel) - return; - - const QModelIndex& aTreeViewIndex = aTableModel->GetTreeViewIndex(theIndex); - if (aTreeViewIndex.isValid()) - emit indexDoubleClicked(aTreeViewIndex); -} diff --git a/tools/DFBrowser/DFBrowser_TreeLevelView.hxx b/tools/DFBrowser/DFBrowser_TreeLevelView.hxx deleted file mode 100644 index b5d61929f3..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelView.hxx +++ /dev/null @@ -1,90 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_TreeLevelView_H -#define DFBrowser_TreeLevelView_H - -#include - -#include - -#include -#include -#include -#include - -class QWidget; -class QTableView; - -//! \class DFBrowser_TreeLevelView -//! This is a control to visualize the current selected item of OCAF tree view in table view. -//! The table contains two columns: name and value. The information is similar the one OCAF tree -//! view label content: children and attributes for the current label. Selection or double click of -//! item emits signals about this event. -class DFBrowser_TreeLevelView : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_TreeLevelView(QWidget* theParent); - - //! Destructor - virtual ~DFBrowser_TreeLevelView() {} - - //! Returns parent control - QWidget* GetControl() const { return myMainWindow; } - - //! Clears selection of the table view selection model - Standard_EXPORT void ClearSelection(); - - //! Returns true if this control may be filled by the index - //! It is possible if an item of the index is application, document or label - //! \param theIndex OCAF tree view model index - //! \return boolean result - Standard_EXPORT static bool ProcessItem(const QModelIndex& theIndex); - - //! Inits view by the first selected item in OCAF tree view - //! \param theSelected selected items - //! \param theDeselected deselected items - Standard_EXPORT void UpdateByTreeSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -signals: - - //! Signal about selection of an item in tree view - //! \param theIndex a tree view model index of selected item - void indexSelected(const QModelIndex& theIndex); - - //! Signal about double click on an item in tree view - //! \param theIndex a tree view model index of selected item - void indexDoubleClicked(const QModelIndex& theIndex); - -private slots: - - //! Listens table view selection model. Gets the first selected tree view model index and emit - //! indexSelected signal. \param theSelected a list of selected items \param theDeselected a list - //! of deselected items - void onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Listens table view double click. Gets clicked index and emit indexDoubleClicked signal. - //! \param theIndex a tree view model index of selected item - void onTableDoubleClicked(const QModelIndex& theIndex); - -private: - QWidget* myMainWindow; //!< parent control - QTableView* myTableView; //!< current view -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx b/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx deleted file mode 100644 index 2aeb877838..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx +++ /dev/null @@ -1,140 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowser_TreeLevelViewModel::Init(const QModelIndex& theTreeIndex) -{ - myIndex = theTreeIndex; - TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex(theTreeIndex); - myRowCount = anItem ? anItem->rowCount() : 0; - if (!anItem) - return; - EmitLayoutChanged(); -} - -// ======================================================================= -// function : GetTreeViewIndex -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeLevelViewModel::GetTreeViewIndex(const QModelIndex& theIndex) const -{ - return myIndex.model()->index(theIndex.row(), 0, myIndex); -} - -// ======================================================================= -// function : headerData -// purpose : -// ======================================================================= -QVariant DFBrowser_TreeLevelViewModel::headerData(int theSection, - Qt::Orientation theOrientation, - int theRole) const -{ - return (theOrientation == Qt::Horizontal && theRole == Qt::DisplayRole && theSection == 1) - ? QVariant(tr("Name")) - : QVariant(); -} - -// ======================================================================= -// function : index -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeLevelViewModel::index(int theRow, - int theColumn, - const QModelIndex& theParent) const -{ - if (!hasIndex(theRow, theColumn, theParent)) - return QModelIndex(); - return createIndex(theRow, theColumn); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowser_TreeLevelViewModel::data(const QModelIndex& theIndex, int theRole) const -{ - QModelIndex anIndex = myIndex.model()->index(theIndex.row(), 0, myIndex); - - if (!anIndex.isValid()) - return QVariant("undefined"); - - QVariant aValue; - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (theIndex.column() == 0) - { - DFBrowser_ItemBasePtr aDBrowserItem = itemDynamicCast(anItemBase); - if (!aDBrowserItem) - return QVariant(); - - bool aPrevValue = aDBrowserItem->SetUseAdditionalInfo(false); - aValue = anItemBase->data(anIndex, theRole); - aDBrowserItem->SetUseAdditionalInfo(aPrevValue); - } - else - { // column = 1 - if (theRole == Qt::DisplayRole || theRole == Qt::ToolTipRole) - { - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - if (anItem) - aValue = anItem->GetAttributeInfo(DFBrowser_ItemRole_AdditionalInfo); - } - } - if (theIndex.column() == 0 && theRole == Qt::FontRole) // method name is in italic - { - QFont aFont = qApp->font(); - aFont.setItalic(true); - return aFont; - } - if (theIndex.column() == 0 && theRole == Qt::ForegroundRole) // method name is light gray - return QColor(Qt::darkGray).darker(150); - - return aValue; -} - -// ======================================================================= -// function : flags -// purpose : -// ======================================================================= -Qt::ItemFlags DFBrowser_TreeLevelViewModel::flags(const QModelIndex& theIndex) const -{ - if (!theIndex.isValid()) - return Qt::NoItemFlags; - Qt::ItemFlags aFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - - return aFlags; -} diff --git a/tools/DFBrowser/DFBrowser_TreeLevelViewModel.hxx b/tools/DFBrowser/DFBrowser_TreeLevelViewModel.hxx deleted file mode 100644 index 89df7c4c18..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeLevelViewModel.hxx +++ /dev/null @@ -1,113 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_TreeLevelViewModel_H -#define DFBrowser_TreeLevelViewModel_H - -#include -#include - -#include -#include -#include -#include - -class QObject; - -//! \class DFBrowser_TreeLevelViewModel -//! Tree Model of one level of OCAF tree view model. It is initialized by tree view index and -//! contains children and attributes of this label. -class DFBrowser_TreeLevelViewModel : public QAbstractTableModel -{ -public: - //! Constructor - DFBrowser_TreeLevelViewModel(QObject* theParent) - : QAbstractTableModel(theParent), - myRowCount(0) - { - } - - //! Destructor - virtual ~DFBrowser_TreeLevelViewModel() {} - - //! Resets OCAF tree model index - void Reset() { myIndex = QModelIndex(); } - - //! Fills OCAF tree model index - //! \param theTreeIndex an index - Standard_EXPORT void Init(const QModelIndex& theTreeIndex); - - //! Returns true if the index is filled - bool IsInitialized() const { return myIndex.isValid(); } - - //! Returns OCAF tree view model index on level defined by column of the parameter index - //! \param theIndex a tree level view model index - //! \return model index - Standard_EXPORT QModelIndex GetTreeViewIndex(const QModelIndex& theIndex) const; - - //! Emits the layoutChanged signal from outside of this class - void EmitLayoutChanged() { emit layoutChanged(); } - - //! Returns value only for DisplayRole for column = 1 - //! \param theSection an index of value in the container - //! \param theIndex a model index - //! \param theRole a view role - //! \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant headerData(int theSection, - Qt::Orientation theOrientation, - int theRole = Qt::DisplayRole) const - Standard_OVERRIDE; - - //! Creates new model index - //! \param theRow the index row position - //! \param theColummn the index column position - //! \param theParent the parent index - //! \return the model index - Standard_EXPORT virtual QModelIndex index(int theRow, - int theColumn, - const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns item information(short) for display role. - //! \param theIndex a model index - //! \param theRole a view role - //! \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns Enabled and Selectable item for any index - //! \param theIndex a model index - //! \return flags - Standard_EXPORT virtual Qt::ItemFlags flags(const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Returns number of rows - virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return myRowCount; - } - - //! Returns 2 columns - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 2; - } - -private: - QModelIndex myIndex; //!< OCAF tree view model index - int myRowCount; //!< number of rows of item of treeview model index -}; -#endif diff --git a/tools/DFBrowser/DFBrowser_TreeModel.cxx b/tools/DFBrowser/DFBrowser_TreeModel.cxx deleted file mode 100644 index f59d6b2d48..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeModel.cxx +++ /dev/null @@ -1,300 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_TreeModel::DFBrowser_TreeModel(QObject* theParent) - : TreeModel_ModelBase(theParent) -{ -} - -// ======================================================================= -// function : InitColumns -// purpose : -// ======================================================================= -void DFBrowser_TreeModel::InitColumns() -{ - setHeaderItem(0, TreeModel_HeaderSection("Name")); -} - -// ======================================================================= -// function : SetModule -// purpose : -// ======================================================================= -void DFBrowser_TreeModel::SetModule(DFBrowser_Module* theModule) -{ - DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast(RootItem(0)); - aRootItem->SetModule(theModule); -} - -// ======================================================================= -// function : createRootItem -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr DFBrowser_TreeModel::createRootItem(const int) -{ - return DFBrowser_ItemApplication::CreateItem(TreeModel_ItemBasePtr()); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowser_TreeModel::Init(const Handle(TDocStd_Application)& theApplication) -{ - DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast(RootItem(0)); - Reset(); - aRootItem->SetApplication(theApplication); - EmitLayoutChanged(); -} - -// ======================================================================= -// function : GetTDocStdApplication -// purpose : -// ======================================================================= -Handle(TDocStd_Application) DFBrowser_TreeModel::GetTDocStdApplication() const -{ - DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast(RootItem(0)); - return aRootItem->GetApplication(); -} - -// ======================================================================= -// function : FindIndex -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeModel::FindIndex(const TDF_Label& theLabel) const -{ - TDF_Label aRoot = theLabel.Root(); - - NCollection_List aLabels; - aLabels.Prepend(theLabel); - TDF_Label aFather = theLabel.Father(); - if (!aFather.IsNull()) - { - while (aFather != aRoot) - { - aLabels.Prepend(aFather); - aFather = aFather.Father(); - } - } - bool aDocumentItemFound = false; - QModelIndex aParentIndex = index(0, 0); - TreeModel_ItemBasePtr aParentItem = - TreeModel_ModelBase::GetItemByIndex(aParentIndex); // application item - // find document, where label of document item is equal to Root label - for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++) - { - QModelIndex anIndex = index(aChildId, 0, aParentIndex); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowser_ItemDocumentPtr anItem = itemDynamicCast(anItemBase); - if (anItem->GetLabel() == aRoot) - { - aParentItem = anItem; - aParentIndex = anIndex; - aDocumentItemFound = true; - break; - } - } - if (!aDocumentItemFound) // document is not found - return QModelIndex(); - - for (NCollection_List::const_iterator aLabelIt = aLabels.begin(); - aLabelIt != aLabels.end() && aParentIndex.isValid(); - aLabelIt++) - { - const TDF_Label aLabel = *aLabelIt; - for (int aParentChildId = 0, aCount = aParentItem->rowCount(); aParentChildId < aCount; - aParentChildId++) - { - QModelIndex anIndex = index(aParentChildId, 0, aParentIndex); - DFBrowser_ItemPtr anItem = - itemDynamicCast(TreeModel_ModelBase::GetItemByIndex(anIndex)); - if (anItem->HasAttribute()) - continue; - - if (anItem->HasLabel() && anItem->GetLabel().IsEqual(aLabel)) - { - aParentItem = anItem; - aParentIndex = anIndex; - break; - } - } - } - return aParentIndex; -} - -// ======================================================================= -// function : FindIndexByPath -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeModel::FindIndexByPath(const QStringList& theLabelEntries, - const QString& theValue) const -{ - QModelIndex aFoundIndex; - - QModelIndex aRootIndex = index(0, 0); - TreeModel_ItemBasePtr aRootItem = - TreeModel_ModelBase::GetItemByIndex(aRootIndex); // application item - // find document, where label of document item is equal to Root label - for (int aDocItemId = 0, aNbDocItems = aRootItem->rowCount(); - aDocItemId < aNbDocItems && !aFoundIndex.isValid(); - aDocItemId++) - { - QModelIndex aParentIndex = index(aDocItemId, 0, aRootIndex); - if (!aParentIndex.isValid()) // OCAF document for this document item is not found - continue; - if (theLabelEntries.size() == 0) - { - aFoundIndex = aParentIndex; - break; - } - TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex(aParentIndex); - for (int aPathId = 1, aPathCount = theLabelEntries.size(); aPathId < aPathCount + 1; aPathId++) - { - QString anEntry; - if (aPathId < aPathCount) - anEntry = theLabelEntries[aPathId]; - else - anEntry = theValue; - - bool aFoundEntry = false; - for (int aChildId = 0, aNbChildren = aParentItem->rowCount(); aChildId < aNbChildren; - aChildId++) - { - QModelIndex anIndex = index(aChildId, 0, aParentIndex); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - - if (aPathId == aPathCount && anItem->HasAttribute()) - { - // processing attribute in theValue - DFBrowser_ItemApplicationPtr aRootAppItem = - itemDynamicCast(RootItem(0)); - QString anAttributeInfo = DFBrowser_Module::GetAttributeInfo(anItem->GetAttribute(), - aRootAppItem->GetModule(), - Qt::DisplayRole, - 0) - .toString(); - if (anAttributeInfo == anEntry) - { - aParentItem = anItem; - aParentIndex = anIndex; - aFoundEntry = true; - break; - } - } - else if (anItem->HasLabel() - && anEntry - == QString(DFBrowserPane_Tools::GetEntry(anItem->GetLabel()).ToCString())) - { - aParentItem = anItem; - aParentIndex = anIndex; - aFoundEntry = true; - break; - } - } - if (!aFoundEntry) // an entry is not found on some level tree, find it in other documents - break; - else - aFoundIndex = aParentIndex; - } - } - return aFoundIndex; -} - -// ======================================================================= -// function : FindIndexByAttribute -// purpose : -// ======================================================================= -QModelIndex DFBrowser_TreeModel::FindIndexByAttribute(Handle(TDF_Attribute) theAttribute) const -{ - QModelIndex aFoundIndex; - const TDF_Label aLabel = theAttribute->Label(); - - QModelIndex aParentIndex = FindIndex(aLabel); - if (!aParentIndex.isValid()) - return aFoundIndex; - - TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex(aParentIndex); - for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++) - { - QModelIndex anIndex = index(aChildId, 0, aParentIndex); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - if (anItem->GetAttribute() == theAttribute) - { - aFoundIndex = anIndex; - break; - } - } - return aFoundIndex; -} - -// ======================================================================= -// function : ConvertToIndices -// purpose : -// ======================================================================= -void DFBrowser_TreeModel::ConvertToIndices(const NCollection_List& theReferences, - QModelIndexList& theIndices) -{ - for (NCollection_List::Iterator aLabelItr(theReferences); aLabelItr.More(); - aLabelItr.Next()) - theIndices.append(FindIndex(aLabelItr.Value())); -} - -// ======================================================================= -// function : ConvertToIndices -// purpose : -// ======================================================================= -void DFBrowser_TreeModel::ConvertToIndices( - const NCollection_List& theReferences, - QModelIndexList& theIndices) -{ - for (NCollection_List::Iterator anAttrItr(theReferences); anAttrItr.More(); - anAttrItr.Next()) - theIndices.append(FindIndexByAttribute(anAttrItr.Value())); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowser_TreeModel::data(const QModelIndex& theIndex, int theRole) const -{ - if (theRole == Qt::BackgroundRole && myHighlightedIndices.contains(theIndex)) - return DFBrowserPane_Tools::LightHighlightColor(); - return TreeModel_ModelBase::data(theIndex, theRole); -} diff --git a/tools/DFBrowser/DFBrowser_TreeModel.hxx b/tools/DFBrowser/DFBrowser_TreeModel.hxx deleted file mode 100644 index c9a741e24a..0000000000 --- a/tools/DFBrowser/DFBrowser_TreeModel.hxx +++ /dev/null @@ -1,121 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_TreeModel_H -#define DFBrowser_TreeModel_H - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -class DFBrowser_Module; -class DFBrowser_TreeModel; - -//! \class DFBrowser_TreeModel -//! Tree model that has items described TDocStd_Application. The structure of items is the -//! following: -//! - : for TDocStd_Application -//! - : for TDocStd_Document -//!- : for either TDF_Label or TDF_Attribute -//! It is possible to visualize some items as highlighted. -class DFBrowser_TreeModel : public TreeModel_ModelBase -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_TreeModel(QObject* theParent); - - //! Destructor - virtual ~DFBrowser_TreeModel() {} - - //! Creates model columns and root items. - Standard_EXPORT virtual void InitColumns() Standard_OVERRIDE; - - //! Fills the root item by the application - Standard_EXPORT void Init(const Handle(TDocStd_Application)& theApplication); - - //! Fills root item by the module - Standard_EXPORT void SetModule(DFBrowser_Module* theModule); - - //! Returns an OCAF application or NULL - //! \return an application instance - Standard_EXPORT Handle(TDocStd_Application) GetTDocStdApplication() const; - - //! Returns true if the tree view model contains highlighted items. This highlight is set - //! manually. - bool HasHighlighted() { return !myHighlightedIndices.isEmpty(); } - - //! Sets items of the indices highlighted in the model. - //! \param theIndices a list of tree model indices - void SetHighlighted(const QModelIndexList& theIndices = QModelIndexList()) - { - myHighlightedIndices = theIndices; - } - - //! Returns tree model index of the label item. It creates container of the label fathers and - //! starting from the rools label it descends by the found labels till the parameter label. - //! \param theLabel an OCAF label - //! \return model index if the value is found or Null model index - Standard_EXPORT QModelIndex FindIndex(const TDF_Label& theLabel) const; - - //! Returns tree model index by list of label entries and (possible) attribute name. - //! \param theLabelEntries a container of label entries starting from root till searched label - //! \param theValue a label entry or attribute name - //! \return model index if the value is found or Null model index - Standard_EXPORT QModelIndex FindIndexByPath(const QStringList& theLabelEntries, - const QString& theValue) const; - - //! Returns tree model index of the attribute item. It gets the attributes label, find index of - //! the label and after find under this item attribute child item. \param theAttribute an OCAF - //! attribute \return model index if the value is found or Null model index - Standard_EXPORT QModelIndex FindIndexByAttribute(Handle(TDF_Attribute) theAttribute) const; - - //! Returns tree model indices for the labels. - Standard_EXPORT void ConvertToIndices(const NCollection_List& theReferences, - QModelIndexList& theIndices); - - //! Returns tree model indices of references - Standard_EXPORT void ConvertToIndices( - const NCollection_List& theReferences, - QModelIndexList& theIndices); - - //! Returns the data stored under the given role for the current item - //! \param theIndex the item model index - //! \param theRole the item model role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - -protected: - //! Creates root item - //! \param theColumnId index of a column - Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) - Standard_OVERRIDE; - -private: - QModelIndexList - myHighlightedIndices; //!< tree model indices that should be visualized as highlighted -}; - -#endif diff --git a/tools/DFBrowser/DFBrowser_Window.cxx b/tools/DFBrowser/DFBrowser_Window.cxx deleted file mode 100644 index 5845f8ad7c..0000000000 --- a/tools/DFBrowser/DFBrowser_Window.cxx +++ /dev/null @@ -1,1120 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if QT_VERSION < 0x050000 - #include -#else - #include -#endif -#include - -const int DFBROWSER_DEFAULT_TREE_VIEW_WIDTH = 325; -const int DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT = 500; -const int DFBROWSER_DEFAULT_VIEW_WIDTH = 400; -const int DFBROWSER_DEFAULT_VIEW_HEIGHT = 300; - -static Standard_Boolean MyIsUseDumpJson = Standard_False; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowser_Window::DFBrowser_Window() - : myModule(0), - myParent(0), - myPropertyPanel(0), - myExportToShapeViewDialog(0) -{ - myMainWindow = new QMainWindow(0); - - // tree view - myTreeView = new ViewControl_TreeView(myMainWindow); - myTreeView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(myTreeView, - SIGNAL(customContextMenuRequested(const QPoint&)), - this, - SLOT(onTreeViewContextMenuRequested(const QPoint&))); - new TreeModel_ContextMenu(myTreeView); - ((ViewControl_TreeView*)myTreeView) - ->SetPredefinedSize( - QSize(DFBROWSER_DEFAULT_TREE_VIEW_WIDTH, DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT)); - myTreeView->setHeaderHidden(true); - myTreeView->setSortingEnabled(Standard_False); - myMainWindow->setCentralWidget(myTreeView); - -#if QT_VERSION < 0x050000 - myTreeView->setStyle(new QWindowsStyle); -#else - myTreeView->setStyle(QStyleFactory::create("Windows")); -#endif - - myTreeLevelLine = new DFBrowser_TreeLevelLine(myMainWindow); - connect(myTreeLevelLine->GetSearchLine(), - SIGNAL(searchActivated()), - this, - SLOT(onSearchActivated())); - connect(myTreeLevelLine, - SIGNAL(indexSelected(const QModelIndex&)), - this, - SLOT(onTreeLevelLineSelected(const QModelIndex&))); - connect(myTreeLevelLine, SIGNAL(updateClicked()), this, SLOT(onUpdateClicked())); - - QDockWidget* aTreeLineDockWidget = new QDockWidget(tr("Tree Level Line"), myMainWindow); - aTreeLineDockWidget->setObjectName(aTreeLineDockWidget->windowTitle()); - aTreeLineDockWidget->setTitleBarWidget(new QWidget(myMainWindow)); - aTreeLineDockWidget->setWidget(myTreeLevelLine->GetControl()); - myMainWindow->addDockWidget(Qt::TopDockWidgetArea, aTreeLineDockWidget); - - // property panel - myPropertyPanel = new DFBrowser_PropertyPanel(myMainWindow); - DFBrowser_AttributePaneStack* anAttributePaneStack = myPropertyPanel->GetAttributesStack(); - anAttributePaneStack->GetSearchView()->SetSearchLine(myTreeLevelLine->GetSearchLine()); - - connect( - anAttributePaneStack->GetPaneSelector(), - SIGNAL( - tableSelectionChanged(const QItemSelection&, const QItemSelection&, QItemSelectionModel*)), - this, - SLOT( - onPaneSelectionChanged(const QItemSelection&, const QItemSelection&, QItemSelectionModel*))); - - DFBrowser_SearchView* aSearchView = anAttributePaneStack->GetSearchView(); - connect(aSearchView, - SIGNAL(pathSelected(const QStringList&, const QString&)), - this, - SLOT(onSearchPathSelected(const QStringList&, const QString&))); - connect(aSearchView, - SIGNAL(pathDoubleClicked(const QStringList&, const QString&)), - this, - SLOT(onSearchPathDoubleClicked(const QStringList&, const QString&))); - - DFBrowser_TreeLevelView* aLevelView = anAttributePaneStack->GetTreeLevelView(); - connect(aLevelView, - SIGNAL(indexSelected(const QModelIndex&)), - this, - SLOT(onLevelSelected(const QModelIndex&))); - connect(aLevelView, - SIGNAL(indexDoubleClicked(const QModelIndex&)), - this, - SLOT(onLevelDoubleClicked(const QModelIndex&))); - - // property custom panel with specific parameters of attributes - QDockWidget* aPropertyPanelWidget = new QDockWidget(tr("PropertyPanel (custom)"), myMainWindow); - aPropertyPanelWidget->setObjectName(aPropertyPanelWidget->windowTitle()); - aPropertyPanelWidget->setTitleBarWidget(new QWidget(myMainWindow)); - aPropertyPanelWidget->setWidget(myPropertyPanel->GetControl()); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, aPropertyPanelWidget); - - // property panel - myUseDumpJson = new QWidget(myMainWindow); - QVBoxLayout* aLay = new QVBoxLayout(myUseDumpJson); - QPushButton* aUseDumpJson = new QPushButton("Use DumpJson", myMainWindow); - aLay->addWidget(aUseDumpJson); - aLay->addStretch(1); - connect(aUseDumpJson, SIGNAL(clicked(bool)), this, SLOT(onUseDumpJson())); - myUseDumpJson->setVisible(false); - - myPropertyPanelWidget = new QDockWidget(tr("PropertyPanel"), myMainWindow); - myPropertyView = new ViewControl_PropertyView( - myMainWindow, - QSize(DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT)); - myPropertyPanelWidget->setObjectName(myPropertyPanelWidget->windowTitle()); - myPropertyPanelWidget->setTitleBarWidget(new QWidget(myMainWindow)); - myPropertyPanelWidget->setWidget(myPropertyView->GetControl()); - updatePropertyPanelWidget(); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, myPropertyPanelWidget); - - // dump view window - QWidget* aDumpWidget = new QWidget(myMainWindow); - QVBoxLayout* aDumpLay = new QVBoxLayout(aDumpWidget); - aDumpLay->setMargin(0); - myDumpView = new DFBrowser_DumpView(aDumpWidget); - aDumpLay->addWidget(myDumpView->GetControl()); - QDockWidget* aDumpDockWidget = new QDockWidget(tr("Dump"), myMainWindow); - aDumpDockWidget->setObjectName(aDumpDockWidget->windowTitle()); - - aDumpDockWidget->setWidget(aDumpWidget); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, aDumpDockWidget); - - // view - myViewWindow = new View_Window(myMainWindow); - myViewWindow->SetPredefinedSize(DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT); - - QDockWidget* aViewDockWidget = new QDockWidget(tr("View"), myMainWindow); - aViewDockWidget->setObjectName(aViewDockWidget->windowTitle()); - aViewDockWidget->setTitleBarWidget(myViewWindow->ViewToolBar()->GetControl()); - aViewDockWidget->setWidget(myViewWindow); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, aViewDockWidget); - - QColor aHColor(229, 243, 255); - myViewWindow->Displayer()->SetAttributeColor(Quantity_Color(aHColor.red() / 255., - aHColor.green() / 255., - aHColor.blue() / 255., - Quantity_TOC_sRGB), - View_PresentationType_Additional); - - myMainWindow->splitDockWidget(myPropertyPanelWidget, aViewDockWidget, Qt::Vertical); - myMainWindow->tabifyDockWidget(myPropertyPanelWidget, aPropertyPanelWidget); - - myMainWindow->tabifyDockWidget(aDumpDockWidget, aViewDockWidget); - - myTreeView->resize(DFBROWSER_DEFAULT_TREE_VIEW_WIDTH, DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT); -} - -// ======================================================================= -// function : Destructor -// purpose : -// ======================================================================= -DFBrowser_Window::~DFBrowser_Window() -{ - delete myModule; -} - -// ======================================================================= -// function : SetParent -// purpose : -// ======================================================================= -void DFBrowser_Window::SetParent(void* theParent) -{ - myParent = (QWidget*)theParent; - if (myParent) - { - QLayout* aLayout = myParent->layout(); - if (aLayout) - aLayout->addWidget(GetMainWindow()); - - if (!myOpenedFileName.isEmpty()) - myParent->setObjectName(myOpenedFileName); - } -} - -// ======================================================================= -// function : FillActionsMenu -// purpose : -// ======================================================================= -void DFBrowser_Window::FillActionsMenu(void* theMenu) -{ - QMenu* aMenu = (QMenu*)theMenu; - QList aDockwidgets = myMainWindow->findChildren(); - for (QList::iterator it = aDockwidgets.begin(); it != aDockwidgets.end(); ++it) - { - QDockWidget* aDockWidget = *it; - if (aDockWidget->parentWidget() == myMainWindow) - aMenu->addAction(aDockWidget->toggleViewAction()); - } -} - -// ======================================================================= -// function : GetPreferences -// purpose : -// ======================================================================= -void DFBrowser_Window::GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) -{ - theItem.Bind("geometry", - TreeModel_Tools::ToString(myMainWindow->saveState()).toStdString().c_str()); - - QMap anItems; - TreeModel_Tools::SaveState(myTreeView, anItems); - View_Window::SaveState(myViewWindow, anItems); - - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); -} - -// ======================================================================= -// function : SetPreferences -// purpose : -// ======================================================================= -void DFBrowser_Window::SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) -{ - if (theItem.IsEmpty()) - { - TreeModel_Tools::SetDefaultHeaderSections(myTreeView); - return; - } - - for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt(theItem); anItemIt.More(); - anItemIt.Next()) - { - if (anItemIt.Key().IsEqual("geometry")) - myMainWindow->restoreState(TreeModel_Tools::ToByteArray(anItemIt.Value().ToCString())); - else if (TreeModel_Tools::RestoreState(myTreeView, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - else if (View_Window::RestoreState(myViewWindow, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - } -} - -// ======================================================================= -// function : UpdateContent -// purpose : -// ======================================================================= -void DFBrowser_Window::UpdateContent() -{ - TCollection_AsciiString aName = "TKDFBrowser"; - - if (myParameters->FindParameters(aName)) - Init(myParameters->Parameters(aName)); - else - Init(NCollection_List()); - - if (myParameters->FindFileNames(aName)) - { - NCollection_List aFileNames = myParameters->FileNames(aName); - if (aFileNames.Extent() > 0) // only one document file might be opened - OpenFile(aFileNames.First()); - myParameters->SetFileNames(aName, NCollection_List()); - } - onUpdateClicked(); - - // make parameter items selected if defined - if (myParameters->FindSelectedNames(aName)) - { - const NCollection_List& aSelected = - myParameters->GetSelectedNames(aName); - - DFBrowser_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - Handle(TDocStd_Application) anApplication = aTreeModel->GetTDocStdApplication(); - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - aSelectionModel->clear(); - - NCollection_List::Iterator aSelectedIt(aSelected); - if (aSelectedIt.More()) - { - TCollection_AsciiString aLabelEntry = aSelectedIt.Value(); - - TDF_Label aLabel; - for (Standard_Integer aDocId = 1, aNbDoc = anApplication->NbDocuments(); aDocId <= aNbDoc; - aDocId++) - { - Handle(TDocStd_Document) aDocument; - anApplication->GetDocument(aDocId, aDocument); - - TDF_Tool::Label(aDocument->GetData(), aLabelEntry.ToCString(), aLabel, Standard_False); - if (!aLabel.IsNull()) - break; - } - if (!aLabel.IsNull()) - { - QModelIndex anIndexToBeSelected = aTreeModel->FindIndex(aLabel); - - TCollection_AsciiString anAttributeType; - aSelectedIt.Next(); - // find attribute by attribute type on the given label - if (aSelectedIt.More()) - { - anAttributeType = aSelectedIt.Value(); - - TreeModel_ItemBasePtr aLabelItem = - TreeModel_ModelBase::GetItemByIndex(anIndexToBeSelected); - // DFBrowser_ItemPtr anItem = itemDynamicCast (anItemBase); - for (int aChildId = 0, aNbChildren = aLabelItem->rowCount(); aChildId < aNbChildren; - aChildId++) - { - QModelIndex anIndex = aTreeModel->index(aChildId, 0, anIndexToBeSelected); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowser_ItemPtr anItem = itemDynamicCast(anItemBase); - if (anItem->HasAttribute()) - { - // processing attribute in theValue - DFBrowser_ItemApplicationPtr aRootAppItem = - itemDynamicCast(aTreeModel->RootItem(0)); - QString anAttributeInfo = - DFBrowser_Module::GetAttributeInfo(anItem->GetAttribute(), - aRootAppItem->GetModule(), - Qt::DisplayRole, - 0) - .toString(); - if (anAttributeInfo == anAttributeType.ToCString()) - { - anIndexToBeSelected = anIndex; - break; - } - } - } - } - aSelectionModel->select(anIndexToBeSelected, QItemSelectionModel::Select); - myTreeView->scrollTo(anIndexToBeSelected); - } - } - - myParameters->SetSelectedNames(aName, NCollection_List()); - } -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowser_Window::Init(const NCollection_List& theParameters) -{ - Handle(TDocStd_Application) anApplication; - if (myModule) - { - DFBrowser_TreeModel* anOCAFViewModel = - dynamic_cast(myModule->GetOCAFViewModel()); - if (anOCAFViewModel) - anApplication = anOCAFViewModel->GetTDocStdApplication(); - } - Handle(AIS_InteractiveContext) aContext; - if (myModule) - aContext = myModule->GetExternalContext(); - - bool aSameApplication = !anApplication.IsNull(), aSameContext = !aContext.IsNull(); - for (NCollection_List::Iterator aParametersIt(theParameters); - aParametersIt.More(); - aParametersIt.Next()) - { - Handle(Standard_Transient) anObject = aParametersIt.Value(); - // check if the object is an application - Handle(TDocStd_Application) anIApplication = Handle(TDocStd_Application)::DownCast(anObject); - if (!anIApplication.IsNull()) - { - aSameApplication = anApplication == anIApplication; - if (!aSameApplication) - anApplication = anIApplication; - } - // check if the object is an interactive context - Handle(AIS_InteractiveContext) anIContext = Handle(AIS_InteractiveContext)::DownCast(anObject); - if (!anIContext.IsNull()) - { - aSameContext = aContext == anIContext; - if (!aSameContext) - aContext = anIContext; - } - } - if (aSameApplication) - { - if (!aSameContext && !aContext.IsNull()) - { - myModule->SetExternalContext(aContext); - myViewWindow->SetContext(View_ContextType_External, aContext); - } - return; - } - - myModule = new DFBrowser_Module(); - myModule->CreateViewModel(myMainWindow); - - myPropertyPanel->GetAttributesStack()->SetModule(myModule); - - // model should be set after the attribute pane stack is initialized by module - QAbstractItemModel* aModel = myModule->GetOCAFViewModel(); - setOCAFModel(aModel); - myModule->SetOCAFViewSelectionModel(myTreeView->selectionModel()); - myTreeLevelLine->GetSearchLine()->SetModule(myModule); - myPropertyPanel->GetAttributesStack()->GetSearchView()->InitModels(); - - connect(myModule, SIGNAL(beforeUpdateTreeModel()), this, SLOT(onBeforeUpdateTreeModel())); - - if (!aContext.IsNull()) - { - myModule->SetExternalContext(aContext); - myViewWindow->SetContext(View_ContextType_External, aContext); - } - - myModule->SetApplication(anApplication); - //! expand first three levels: CUSTOM - QModelIndex aParentIndex = aModel->index(0, 0); - setExpandedLevels(myTreeView, aParentIndex, 3 /*levels*/); - - myModule->SetInitialTreeViewSelection(); -} - -// ======================================================================= -// function : OpenFile -// purpose : -// ======================================================================= -void DFBrowser_Window::OpenFile(const TCollection_AsciiString& theFileName) -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - myTreeLevelLine->ClearHistory(); - QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel(); - if (aSelectionModel) - { - aSelectionModel->clearSelection(); - QModelIndex anIndex; - aSelectionModel->select(anIndex, QItemSelectionModel::ClearAndSelect); - } - - myTreeLevelLine->ClearHistory(); - - DFBrowser_TreeModel* anOCAFViewModel = - dynamic_cast(myModule->GetOCAFViewModel()); - anOCAFViewModel->Reset(); - - //! close previous documents to open new document - Handle(TDocStd_Application) anApplication = myModule->GetTDocStdApplication(); - if (!anApplication.IsNull()) - { - for (int aDocId = 1, aNbDocuments = anApplication->NbDocuments(); aDocId <= aNbDocuments; - aDocId++) - { - Handle(TDocStd_Document) aDocument; - anApplication->GetDocument(aDocId, aDocument); - if (!aDocument.IsNull()) - anApplication->Close(aDocument); - } - } - - //! open new document - bool isSTEPFileName = false; - anApplication = DFBrowser_OpenApplication::OpenApplication(theFileName, isSTEPFileName); - - if (myParent) - myParent->setObjectName(isSTEPFileName - ? QString(TCollection_AsciiString(theFileName).ToCString()) - : getWindowTitle()); - else - myOpenedFileName = - isSTEPFileName ? QString(TCollection_AsciiString(theFileName).ToCString()) : getWindowTitle(); - - if (anApplication.IsNull()) - { - QApplication::restoreOverrideCursor(); - QMessageBox::information(0, - "Error", - QString("File %1 can't be opened by OCAF application") - .arg(TCollection_AsciiString(theFileName).ToCString())); - } - else - { - myModule->SetApplication(anApplication); - //! expand first three levels: CUSTOM - QModelIndex aParentIndex = anOCAFViewModel->index(0, 0); - setExpandedLevels(myTreeView, aParentIndex, 3 /*levels*/); - - myModule->SetInitialTreeViewSelection(); - QApplication::restoreOverrideCursor(); - } -} - -// ======================================================================= -// function : getWindowTitle -// purpose : -// ======================================================================= -QString DFBrowser_Window::getWindowTitle() const -{ - DFBrowser_TreeModel* anOCAFViewModel = - dynamic_cast(myModule->GetOCAFViewModel()); - if (!anOCAFViewModel) - return ""; - - Handle(TDocStd_Application) anApplication = anOCAFViewModel->GetTDocStdApplication(); - if (anApplication.IsNull() || anApplication->NbDocuments() == 0) - return ""; - - Handle(TDocStd_Document) aDocument; - anApplication->GetDocument(1, aDocument); - if (aDocument.IsNull() || !aDocument->IsSaved()) - return ""; - - return DFBrowserPane_Tools::ToString(aDocument->GetPath()); -} - -// ======================================================================= -// function : setExpandedLevels -// purpose : -// ======================================================================= -void DFBrowser_Window::setExpandedLevels(QTreeView* theTreeView, - const QModelIndex& theParentIndex, - const int theLevels) -{ - if (theLevels <= 0) - return; - - QAbstractItemModel* aModel = theTreeView->model(); - if (!aModel) - return; - - theTreeView->setExpanded(theParentIndex, true); - for (int aRowId = 0, aRows = aModel->rowCount(theParentIndex); aRowId < aRows; aRowId++) - setExpandedLevels(theTreeView, aModel->index(aRowId, 0, theParentIndex), theLevels - 1); -} - -// ======================================================================= -// function : setOCAFModel -// purpose : -// ======================================================================= -void DFBrowser_Window::setOCAFModel(QAbstractItemModel* theModel) -{ - myTreeView->setModel(theModel); - - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(theModel); - myTreeView->setSelectionModel(aSelectionModel); - - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - myTreeLevelLine, - SLOT(OnTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&))); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - myDumpView, - SLOT(OnTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&))); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&))); -} - -// ======================================================================= -// function : onBeforeUpdateTreeModel -// purpose : -// ======================================================================= -void DFBrowser_Window::onBeforeUpdateTreeModel() -{ - myTreeLevelLine->ClearHistory(); -} - -// ======================================================================= -// function : TmpDirectory -// purpose : -// ======================================================================= -TCollection_AsciiString DFBrowser_Window::TmpDirectory() -{ - TCollection_AsciiString aTmpDir; -#ifdef _WIN32 - OSD_Environment anEnvironment("TEMP"); - aTmpDir = anEnvironment.Value(); - if (aTmpDir.IsEmpty()) - { - anEnvironment.SetName("TMP"); - aTmpDir = anEnvironment.Value(); - if (aTmpDir.IsEmpty()) - aTmpDir = "C:\\"; - } - OSD_Path aTmpPath(aTmpDir); - OSD_Directory aTmpDirectory(aTmpPath); - if (!aTmpDirectory.Exists()) - aTmpDirectory.Build(OSD_Protection()); -#else - OSD_Directory aTmpDirectory = OSD_Directory::BuildTemporary(); - OSD_Path aTmpPath; - aTmpDirectory.Path(aTmpPath); - aTmpPath.SystemName(aTmpDir); -#endif - - return aTmpDir; -} - -// ======================================================================= -// function : SetUseDumpJson -// purpose : -// ======================================================================= -void DFBrowser_Window::SetUseDumpJson(const Standard_Boolean theValue) -{ - MyIsUseDumpJson = theValue; -} - -// ======================================================================= -// function : IsUseDumpJson -// purpose : -// ======================================================================= -Standard_Boolean DFBrowser_Window::IsUseDumpJson() -{ - return MyIsUseDumpJson; -} - -// ======================================================================= -// function : onTreeViewContextMenuRequested -// purpose : -// ======================================================================= -void DFBrowser_Window::onTreeViewContextMenuRequested(const QPoint& thePosition) -{ - QMenu* aMenu = new QMenu(GetMainWindow()); - aMenu->addAction( - ViewControl_Tools::CreateAction(tr("Expand"), SLOT(onExpand()), GetMainWindow(), this)); - aMenu->addAction( - ViewControl_Tools::CreateAction(tr("Expand All"), SLOT(onExpandAll()), GetMainWindow(), this)); - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Collapse All"), - SLOT(onCollapseAll()), - GetMainWindow(), - this)); - - aMenu->addSeparator(); - QAction* aUseDumpJsonAction = ViewControl_Tools::CreateAction(tr("Use DumpJson"), - SLOT(onUseDumpJson()), - GetMainWindow(), - this); - aUseDumpJsonAction->setCheckable(true); - aUseDumpJsonAction->setChecked(IsUseDumpJson()); - aMenu->addAction(aUseDumpJsonAction); - - QPoint aPoint = myTreeView->mapToGlobal(thePosition); - aMenu->exec(aPoint); -} - -// ======================================================================= -// function : onExpand -// purpose : -// ======================================================================= -void DFBrowser_Window::onExpand() -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - int aLevels = 2; - TreeModel_Tools::SetExpanded(myTreeView, aSelectedIndices[aSelectedId], true, aLevels); - } - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onExpandAll -// purpose : -// ======================================================================= -void DFBrowser_Window::onExpandAll() -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - int aLevels = -1; - TreeModel_Tools::SetExpanded(myTreeView, aSelectedIndices[aSelectedId], true, aLevels); - } - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onCollapseAll -// purpose : -// ======================================================================= -void DFBrowser_Window::onCollapseAll() -{ - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - int aLevels = -1; - TreeModel_Tools::SetExpanded(myTreeView, aSelectedIndices[aSelectedId], false, aLevels); - } -} - -// ======================================================================= -// function : onUseDumpJson -// purpose : -// ======================================================================= -void DFBrowser_Window::onUseDumpJson() -{ - SetUseDumpJson(!IsUseDumpJson()); - updatePropertyPanelWidget(); - - QApplication::setOverrideCursor(Qt::WaitCursor); - myModule->UpdateTreeModel(); - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onTreeViewSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_Window::onTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected) -{ - if (!myModule) - return; - - if (IsUseDumpJson() && myPropertyPanelWidget->toggleViewAction()->isChecked()) - { - myPropertyView->Init(ViewControl_Tools::CreateTableModelValues(myTreeView->selectionModel())); - } - - // previuos selection should be cleared in the panel selectors - DFBrowser_AttributePaneStack* anAttributePaneStack = myPropertyPanel->GetAttributesStack(); - anAttributePaneStack->GetPaneSelector()->ClearSelected(); - - myPropertyPanel->UpdateBySelectionChanged(theSelected, theDeselected); - anAttributePaneStack->GetTreeLevelView()->UpdateByTreeSelectionChanged(theSelected, - theDeselected); - - QModelIndexList aSelectedIndices = theSelected.indexes(); - QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected(aSelectedIndices, 0); - - myTreeView->scrollTo(aSelectedIndex); - View_Displayer* aDisplayer = myViewWindow->Displayer(); - - aDisplayer->ErasePresentations(View_PresentationType_Additional, false); - aDisplayer->DisplayPresentation(findPresentation(aSelectedIndex), View_PresentationType_Main); -} - -// ======================================================================= -// function : onSearchActivated -// purpose : -// ======================================================================= -void DFBrowser_Window::onSearchActivated() -{ - myPropertyPanel->GetAttributesStack()->SetPaneMode( - (myTreeLevelLine->GetSearchLine()->Text().isEmpty() ? DFBrowser_AttributePaneType_ItemView - : DFBrowser_AttributePaneType_SearchView)); -} - -// ======================================================================= -// function : onPaneSelectionChanged -// purpose : -// ======================================================================= -void DFBrowser_Window::onPaneSelectionChanged(const QItemSelection&, - const QItemSelection&, - QItemSelectionModel* theModel) -{ - DFBrowserPane_AttributePaneAPI* anAttributePane = - myPropertyPanel->GetAttributesStack()->GetCurrentPane(); - switch (anAttributePane->GetSelectionKind(theModel)) - { - case DFBrowserPane_SelectionKind_ExportToShapeViewer: { - QItemSelectionModel* aSelectionModel = theModel; - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - if (aSelectedIndices.size() != 1) - return; - - TCollection_AsciiString aPluginName("TKShapeView"); - NCollection_List aParameters; - if (myParameters->FindParameters(aPluginName)) - aParameters = myParameters->Parameters(aPluginName); - - NCollection_List anItemNames; - if (myParameters->FindSelectedNames(aPluginName)) - anItemNames = myParameters->GetSelectedNames(aPluginName); - - int aParametersCount = aParameters.Extent(); - anAttributePane->GetSelectionParameters(aSelectionModel, aParameters, anItemNames); - if (aParametersCount != aParameters.Extent()) // some TShapes are added - { - TCollection_AsciiString aPluginShortName = aPluginName.SubString(3, aPluginName.Length()); - QString aMessage = QString("TShape %1 is sent to %2.") - .arg(Standard_Dump::GetPointerInfo(aParameters.Last()).ToCString()) - .arg(aPluginShortName.ToCString()); - QString aQuestion = QString("Would you like to activate %1 immediately?\n") - .arg(aPluginShortName.ToCString()) - .toStdString() - .c_str(); - if (!myExportToShapeViewDialog) - myExportToShapeViewDialog = new ViewControl_MessageDialog(myParent, aMessage, aQuestion); - else - myExportToShapeViewDialog->SetInformation(aMessage); - myExportToShapeViewDialog->Start(); - - myParameters->SetSelectedNames(aPluginName, anItemNames); - myParameters->SetParameters(aPluginName, - aParameters, - myExportToShapeViewDialog->IsAccepted()); - } - return; - } - case DFBrowserPane_SelectionKind_ExportToBREP: - case DFBrowserPane_SelectionKind_LabelReferences: - case DFBrowserPane_SelectionKind_AttributeReferences: - default: - break; - } - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - if (aSelectedIndices.size() != 1) - return; - - // make the shape visualized - QModelIndex aSelectedIndex = aSelectedIndices.first(); - View_Displayer* aDisplayer = myViewWindow->Displayer(); - aDisplayer->DisplayPresentation(findPresentation(aSelectedIndex), View_PresentationType_Main); - - // highlight and scroll to the referenced item if it exists - Handle(TDF_Attribute) anAttribute = myModule->FindAttribute(aSelectedIndex); - NCollection_List aReferences; - Handle(Standard_Transient) aPresentation; - anAttributePane->GetReferences(anAttribute, aReferences, aPresentation); - QModelIndexList anIndices; - DFBrowser_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - if (!aReferences.IsEmpty()) - aTreeModel->ConvertToIndices(aReferences, anIndices); - else - { - NCollection_List anAttributeReferences; - anAttributePane->GetAttributeReferences(anAttribute, anAttributeReferences, aPresentation); - aTreeModel->ConvertToIndices(anAttributeReferences, anIndices); - } - highlightIndices(anIndices); - // display either the reference presentation of the panel or find a presentation if the reference - // is an attribute - if (!aPresentation.IsNull()) - aDisplayer->DisplayPresentation(aPresentation, View_PresentationType_Additional); - else - { - aDisplayer->ErasePresentations(View_PresentationType_Additional, false); - AIS_ListOfInteractive aDisplayed; - findPresentations(anIndices, aDisplayed); - for (AIS_ListIteratorOfListOfInteractive aDisplayedIt(aDisplayed); aDisplayedIt.More(); - aDisplayedIt.Next()) - aDisplayer->DisplayPresentation(aDisplayedIt.Value(), - View_PresentationType_Additional, - false); - - aDisplayer->UpdateViewer(); - } -} - -// ======================================================================= -// function : onTreeLevelLineSelected -// purpose : -// ======================================================================= -void DFBrowser_Window::onTreeLevelLineSelected(const QModelIndex& theIndex) -{ - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - if (theIndex.isValid()) - aSelectionModel->select(theIndex, QItemSelectionModel::ClearAndSelect); - else - aSelectionModel->clearSelection(); -} - -// ======================================================================= -// function : onUpdateClicked -// purpose : -// ======================================================================= -void DFBrowser_Window::onUpdateClicked() -{ - if (myModule) - myModule->UpdateTreeModel(); -} - -// ======================================================================= -// function : onSearchPathSelected -// purpose : -// ======================================================================= -void DFBrowser_Window::onSearchPathSelected(const QStringList& thePath, const QString& theValue) -{ - DFBrowser_TreeModel* aDFBrowserModel = dynamic_cast(myTreeView->model()); - const QModelIndex& anIndex = aDFBrowserModel->FindIndexByPath(thePath, theValue); - - if (anIndex.isValid()) - { - QModelIndexList anIndices; - anIndices.append(anIndex); - highlightIndices(anIndices); - } -} - -// ======================================================================= -// function : onSearchPathDoubleClicked -// purpose : -// ======================================================================= -void DFBrowser_Window::onSearchPathDoubleClicked(const QStringList& thePath, - const QString& theValue) -{ - DFBrowser_TreeModel* aDFBrowserModel = dynamic_cast(myTreeView->model()); - const QModelIndex& anIndex = aDFBrowserModel->FindIndexByPath(thePath, theValue); - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - if (anIndex.isValid()) - aSelectionModel->select(anIndex, QItemSelectionModel::ClearAndSelect); - else - aSelectionModel->clearSelection(); -} - -// ======================================================================= -// function : onLevelSelected -// purpose : -// ======================================================================= -void DFBrowser_Window::onLevelSelected(const QModelIndex& theIndex) -{ - if (!theIndex.isValid()) - return; - - QModelIndexList anIndices; - anIndices.append(theIndex); - highlightIndices(anIndices); - View_Displayer* aDisplayer = myViewWindow->Displayer(); - aDisplayer->ErasePresentations(View_PresentationType_Additional, false); - aDisplayer->DisplayPresentation(findPresentation(theIndex), View_PresentationType_Main); -} - -// ======================================================================= -// function : onLevelDoubleClicked -// purpose : -// ======================================================================= -void DFBrowser_Window::onLevelDoubleClicked(const QModelIndex& theIndex) -{ - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - if (theIndex.isValid()) - aSelectionModel->select(theIndex, QItemSelectionModel::ClearAndSelect); - else - aSelectionModel->clearSelection(); -} - -// ======================================================================= -// function : highlightIndices -// purpose : -// ======================================================================= -void DFBrowser_Window::highlightIndices(const QModelIndexList& theIndices) -{ - QAbstractItemModel* aModel = myTreeView->model(); - if (!aModel) - return; - - DFBrowser_TreeModel* aTreeModel = dynamic_cast(aModel); - if (!aTreeModel) - return; - - aTreeModel->SetHighlighted(theIndices); - - QModelIndex anIndexToScroll; - if (!theIndices.isEmpty()) - anIndexToScroll = theIndices.last(); // scroll to last selected index - else - { - // scroll to tree selected item - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - if (aSelectedIndices.size() == 1) - anIndexToScroll = aSelectedIndices.first(); - } - if (anIndexToScroll.isValid()) - myTreeView->scrollTo(anIndexToScroll); - - if (theIndices.isEmpty()) - myTreeView->setFocus(); // to see the selected item in active palette color - - aTreeModel->EmitLayoutChanged(); -} - -// ======================================================================= -// function : findPresentation -// purpose : -// ======================================================================= -Handle(AIS_InteractiveObject) DFBrowser_Window::findPresentation(const QModelIndex& theIndex) -{ - Handle(AIS_InteractiveObject) aPresentation; - - QModelIndexList anIndices; - anIndices.append(theIndex); - AIS_ListOfInteractive aDisplayed; - findPresentations(anIndices, aDisplayed); - if (!aDisplayed.IsEmpty()) - aPresentation = aDisplayed.First(); - - return aPresentation; -} - -// ======================================================================= -// function : findPresentations -// purpose : -// ======================================================================= -void DFBrowser_Window::findPresentations(const QModelIndexList& theIndices, - AIS_ListOfInteractive& thePresentations) -{ - for (int anIndexId = 0, aCount = theIndices.size(); anIndexId < aCount; anIndexId++) - { - Handle(AIS_InteractiveObject) aPresentation; - Handle(TDF_Attribute) anAttribute = myModule->FindAttribute(theIndices[anIndexId]); - if (anAttribute.IsNull()) - continue; - DFBrowserPane_AttributePaneAPI* anAttributePane = myModule->GetAttributePane(anAttribute); - if (!anAttributePane) - continue; - aPresentation = - Handle(AIS_InteractiveObject)::DownCast(anAttributePane->GetPresentation(anAttribute)); - if (aPresentation.IsNull()) - continue; - - thePresentations.Append(aPresentation); - } -} - -// ======================================================================= -// function : updatePropertyPanelWidget -// purpose : -// ======================================================================= -void DFBrowser_Window::updatePropertyPanelWidget() -{ - bool aUseDumpJson = IsUseDumpJson(); - - myUseDumpJson->setVisible(!aUseDumpJson); - myPropertyPanelWidget->setWidget(aUseDumpJson ? myPropertyView->GetControl() : myUseDumpJson); -} diff --git a/tools/DFBrowser/DFBrowser_Window.hxx b/tools/DFBrowser/DFBrowser_Window.hxx deleted file mode 100644 index 232b17290c..0000000000 --- a/tools/DFBrowser/DFBrowser_Window.hxx +++ /dev/null @@ -1,249 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_Window_H -#define DFBrowser_Window_H - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -class DFBrowser_DumpView; -class DFBrowser_Module; -class DFBrowser_PropertyPanel; -class DFBrowser_TreeLevelLine; - -class ViewControl_MessageDialog; -class ViewControl_PropertyView; - -class View_ToolBar; -class View_Window; - -class QAbstractItemModel; -class QAction; -class QDockWidget; -class QTreeView; -class QWidget; - -//! \class DFBrowser_Window -//! Window that unites all DFBrowser controls. -//! External functionality : it processes plugin parameters, updates controls content and places -//! itself in parent layout. It Synchronizes controls content depending on current selection. It -//! shows context popup menu for OCAF tree view. -class DFBrowser_Window : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowser_Window(); - - //! Destructor - Standard_EXPORT virtual ~DFBrowser_Window(); - - //! Appends main window into layout of the parent if the parent is child of QWidget - //! \param theParent a parent class - Standard_EXPORT void SetParent(void* theParent); - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - { - myParameters = theParameters; - } - - //! Provides container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - Standard_EXPORT virtual void FillActionsMenu(void* theMenu); - - //! Returns plugin preferences: dock widgets state, tree view columns. - //! \param theItem container of preference elements - Standard_EXPORT void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies plugin preferences - //! \param theItem container of preference elements - Standard_EXPORT void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies parameters to Init controls, opens files if there are in parameters, updates OCAF tree - //! view model - Standard_EXPORT void UpdateContent(); - - //! Fills controls of the plugin by parameters: - //! - Find TDocStd_Application and fills OCAF tree model if it differs from the current - //! application - //! - Fine AIS_InteractiveObject and fills View if it if it differs from the current context - //! - If it is the first call, it creates module, fills selection models - //! \param theParameters a parameters container - Standard_EXPORT void Init(const NCollection_List& theParameters); - - //! Opens application by the name, it may be either OCAF document or STEP file. - //! Before opening it cleans tree view history, current selections, - //! reset OCAF tree view model. After opening document, it fills all controls by the created - //! application. \param theFileName a file name to be opened - Standard_EXPORT void OpenFile(const TCollection_AsciiString& theFileName); - - //! Returns main control - QWidget* GetMainWindow() const { return myMainWindow; } - - //! Returns the current module - DFBrowser_Module* GetModule() const { return myModule; } - - //! Returns tree level line control - DFBrowser_TreeLevelLine* GetTreeLevelLine() const { return myTreeLevelLine; } - - //! Returns temporary directory defined by environment variables TEMP or TMP - //! \return string value - Standard_EXPORT static TCollection_AsciiString TmpDirectory(); - - //! Sets whether DumpJson is used when the tree view is generated - Standard_EXPORT static void SetUseDumpJson(const Standard_Boolean theValue); - - //! Returns whether DumpJson is used when the tree view is generated - Standard_EXPORT static Standard_Boolean IsUseDumpJson(); - -private slots: - - //! Cleans history in tree level line - void onBeforeUpdateTreeModel(); - - //! Shows context menu for tree view selected item. It contains clear view or BREP operations - //! items \param thePosition a clicked point - void onTreeViewContextMenuRequested(const QPoint& thePosition); - - //! Expands two next levels for all selected item - void onExpand(); - - //! Expands all levels for all selected items - void onExpandAll(); - - //! Collapses all levels for all selected items - void onCollapseAll(); - - //! Setting flag whether DumpJSon should be applied to build tree model items structure - void onUseDumpJson(); - - //! Updates all controls by changed selection in OCAF tree view - //! \param theSelected list of selected tree view items - //! \param theDeselected list of deselected tree view items - void onTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Changes attribute pane stack content depending on search control text - void onSearchActivated(); - - //! Processes selection change in attribute pane. Depending on selection kind, it will: - //! - export to shape viewer - //! - display presentation of the pane - //! - display references - void onPaneSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected, - QItemSelectionModel* theModel); - - //! Selects the item in OCAF tree view - //! \param theIndex OCAF tree view index - void onTreeLevelLineSelected(const QModelIndex& theIndex); - - //! Updates OCAF tree model - void onUpdateClicked(); - - //! Highlights OCAF tree model item - //! \param thePath a container of entries to the item - //! \param theValue a label entry or attribute name - void onSearchPathSelected(const QStringList& thePath, const QString& theValue); - - //! Selects OCAF tree model item - //! \param thePath a container of entries to the item - //! \param theValue a label entry or attribute name - void onSearchPathDoubleClicked(const QStringList& thePath, const QString& theValue); - - //! Highlights OCAF tree model item - //! \param theIndex an OCAF tree model index - void onLevelSelected(const QModelIndex& theIndex); - - //! Selects OCAF tree model item - //! \param theIndex an OCAF tree model index - void onLevelDoubleClicked(const QModelIndex& theIndex); - -private: - //! Inits OCAF tree view with the given model - //! \param theModel a model - void setOCAFModel(QAbstractItemModel* theModel); - - //! Sets expanded levels in OCAF tree view. Do recursive expand of items. - //! \param theTreeView an OCAF tree view - //! \param theParentIndex an index which children should be expanded - //! \param theLevels a number of levels to be expanded, or -1 for all levels - static void setExpandedLevels(QTreeView* theTreeView, - const QModelIndex& theParentIndex, - const int theLevels); - - //! Marks items highlighted in OCAF tree view model and move view scroll to the first item - //! \param theIndices a container of OCAF tree view model indices - void highlightIndices(const QModelIndexList& theIndices); - - //! Returns candidate to be the window title. It is either name of opened STEP file or the - //! application path \return string value - QString getWindowTitle() const; - -protected: - //! Returns presentation for the OCAF tree model index. To do this, it uses attribute pane for - //! this item \param theIndex a model index \return presentation or NULL - Handle(AIS_InteractiveObject) findPresentation(const QModelIndex& theIndex); - - //! Returns presentations for the OCAF tree model indices. To do this, it uses attribute pane for - //! this items \param theIndex a model index \return container of presentations or NULL - void findPresentations(const QModelIndexList& theIndices, - AIS_ListOfInteractive& thePresentations); - - //! Updates content of Property Panel dock widget. It contains button to activate DumpJson or view - //! with content of it. - void updatePropertyPanelWidget(); - -private: - DFBrowser_Module* myModule; //!< current module - QWidget* myParent; //!< widget, comes when Init window, the window control lays in the layout, - //!< updates window title - QMainWindow* myMainWindow; //!< main control for all components - DFBrowser_TreeLevelLine* myTreeLevelLine; //!< navigate line of tree levels to the selected item - QTreeView* myTreeView; //!< OCAF tree view - QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget - QWidget* myUseDumpJson; //!< button to activate/deactivate using of DumpJson - DFBrowser_PropertyPanel* - myPropertyPanel; //!< property panel shows full information about attribute or search view - ViewControl_PropertyView* - myPropertyView; //!< property control to display model item values if exist - View_Window* myViewWindow; //!< V3d view to visualize presentations/references if it can be build - //!< for a selected item - DFBrowser_DumpView* myDumpView; //!< Text editor where "Dump" method output is shown - ViewControl_MessageDialog* - myExportToShapeViewDialog; //!< dialog about exporting TopoDS_Shape to ShapeView plugin - Handle(TInspectorAPI_PluginParameters) - myParameters; //!< contains application, context, files that should be opened - QString myOpenedFileName; //!< cached name of opened file between parent is set, apply it by - //!< parent setting and nullify -}; - -#endif diff --git a/tools/DFBrowser/FILES b/tools/DFBrowser/FILES deleted file mode 100644 index d4d1f2b2cf..0000000000 --- a/tools/DFBrowser/FILES +++ /dev/null @@ -1,48 +0,0 @@ -DFBrowser.qrc -DFBrowser_AttributePaneStack.cxx -DFBrowser_AttributePaneStack.hxx -DFBrowser_AttributePaneType.hxx -DFBrowser_Communicator.cxx -DFBrowser_Communicator.hxx -DFBrowser_DumpView.cxx -DFBrowser_DumpView.hxx -DFBrowser_HighlightDelegate.cxx -DFBrowser_HighlightDelegate.hxx -DFBrowser_Item.cxx -DFBrowser_Item.hxx -DFBrowser_ItemApplication.cxx -DFBrowser_ItemApplication.hxx -DFBrowser_ItemBase.cxx -DFBrowser_ItemBase.hxx -DFBrowser_ItemDocument.cxx -DFBrowser_ItemDocument.hxx -DFBrowser_ItemRole.hxx -DFBrowser_Module.cxx -DFBrowser_Module.hxx -DFBrowser_OpenApplication.cxx -DFBrowser_OpenApplication.hxx -DFBrowser_PropertyPanel.cxx -DFBrowser_PropertyPanel.hxx -DFBrowser_SearchItemInfo.hxx -DFBrowser_SearchLine.cxx -DFBrowser_SearchLine.hxx -DFBrowser_SearchLineModel.cxx -DFBrowser_SearchLineModel.hxx -DFBrowser_SearchView.cxx -DFBrowser_SearchView.hxx -DFBrowser_Tools.cxx -DFBrowser_Tools.hxx -DFBrowser_TreeLevelLine.cxx -DFBrowser_TreeLevelLine.hxx -DFBrowser_TreeLevelLineDelegate.cxx -DFBrowser_TreeLevelLineDelegate.hxx -DFBrowser_TreeLevelLineModel.cxx -DFBrowser_TreeLevelLineModel.hxx -DFBrowser_TreeLevelView.cxx -DFBrowser_TreeLevelView.hxx -DFBrowser_TreeLevelViewModel.cxx -DFBrowser_TreeLevelViewModel.hxx -DFBrowser_TreeModel.cxx -DFBrowser_TreeModel.hxx -DFBrowser_Window.cxx -DFBrowser_Window.hxx diff --git a/tools/DFBrowser/icons/attribute.png b/tools/DFBrowser/icons/attribute.png deleted file mode 100644 index c9c43c22e357dd034743db6eed118d8c8243616d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP*uC9 zi(`m|e{aA|(FOyKrFN>pM4i?p0HgxCUbqBR!i_NHlzD07Tb3-=Q?iXJYm(b^6K5t*ERyd zwGI!Rx!za5ul2dzcuv1QMsJ4EYgt}-hM7j!<^|4uaAt$e`p};0uG5EgflgxZboFyt I=akR{07)NRxBvhE diff --git a/tools/DFBrowser/icons/attribute_40x40.png b/tools/DFBrowser/icons/attribute_40x40.png deleted file mode 100644 index 6446f323d6248f273ed4c899cbc3ebdac2a31571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)N2bPDNB8 zb~7$DE-^4L^m3s9009Jg<%)dqsz%Qt5mD2P=Q70_!3ipNQ3Xu zR_%Mn6vR2_?~ED8(cgs$ZQ4g|KllBh9tFA2C~hUH0bpuW90;vxQb9cy z$86%*ty|+2x-HI`8X$;N?JIhbDEk zJPm8HbZStGIeQS*9}5Qs?;dI_41gBL8L5I?zFs7`*jd(1^ia>ENG+Bg8HAjKEqDD2 z&e!%%G3CzCH|AP|bdGai?p`Fhutg#zrAVYSQY6NF0LX5+raJ-YG5`Po07*qoM6N<$ Ef`Y20t^fc4 diff --git a/tools/DFBrowser/icons/export_shape.png b/tools/DFBrowser/icons/export_shape.png deleted file mode 100644 index add5920d46a5de6b30a3a534adc75780dda1eff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstUx|zfk$L9 z0|Vb75M~tB@M-`GN|m@qlmzFem6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8R5iiV z#WBRf|8CDs-XjV;tie{U1ydP?{#IW1=oYD3MM`qaxKx!5WqS?3U9SHBx9R(WD~9t_Pkf(pDX~P^OVhdMqNCdL zJI|wDziLSoc;hae5|w>eCx?ZJ^?SpmPnRBCyriGMn}4&7{GaK+o3A^ZW>@{zJpKQp Szt%vvF?hQAxvX!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~A~99;!8$kNlr zF{C2y?JV0okwAeKb7g0l#wk5LJ;oA(6D^C~-b5F$bSEn){$%oC@vzw9($@0i&M}?! z*KA(|uHR#Q`?B@ts9Tfv9k7oM{+p?EdiBoD|F&4^#)x0Lxj}fEr{o8Pcb|nV^_a^} z?a}1_r~dBW?bTo3o;L=GT(Z&R&pC4UU)BDFa#K02-)_+4uL`*n_+Z);_BSHt0sW_1 z=1R>DvWdFmV5=ouR^;RL@ZKY~SAjD(TwcCZWam-dD~pX1xoR|7CqtN8HI4^E3Yl$m zxR)Ig7txTEtB4TuY1P*VFtYiuL1zY6e87T~iU*022BP~GIGp@&;P9pdpq9o-4;$N4 z4~G0`Vp2WK%zwIRlp*)Zi1C4AhY~Z;g5;qIz$|Wfk zE80>McG<9`dbPD@#k@aq!Z~0CP>}7L&m0?;r69qS^G8lP2dqk|Sg@~j zwsKin3`p?7MqB)X(g$Dt$&x(AraYC0zov%e(+*3C$wnWT{$E=L)cja^!tt{Q*G(yu zt}M5|=P4=o;|Ir+!r~3OsS!JD4jlj9p&23Sxx9DFtm8pmd`kQuZphvAxS`6wVoFo< zNoJdE?p<^4ern+2;!_1m-P`fwhui6(pwNIteEm)A-;ab4`@_!{EuO61xfw6)HAL9!}}ErLS*Gw+ls_h9thd;&`wlj#o@&dHnt~p*(7M)Dp(FRE@Rm#kn-=VAj*4H zoWQ0#yyn`?nWP zXZ^ceDgVQAb-Oo>H=Zl};hDFOK^KL6YGFooaGJo+SF^l83!_xCAIqbbt z;~O{c%`Kfa!Q5;y%elYXuD* d)2_bKzx8zgC9VAyzkwwUgQu&X%Q~loCIHBs8X5oq diff --git a/tools/DFBrowser/icons/item_type_folder.png b/tools/DFBrowser/icons/item_type_folder.png deleted file mode 100644 index 078dd3453f98814760d76cea8a9d5c0b11665c38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmV-t0+{`YP)N2bPDNB8 zb~7$DE-^4L^m3s900HAkL_t(IPpy>8O9D|Gh5L^UA_&T&MdpY`FDrV{i&|B*Z50u{ zC<+2iGar>rrb%NnPC1Lyxp&klvk9xk$Kc5MJok6+wGF_(()8tD`1HZd456G3qMQuE zNCco?DR_x1&`IgiPX=wGK4=jijAD#27hyRSf>m52tFWF{VC5Idfz6e{Wj-qbMO?#E%?jzK-{Wz0obiu);Cc4V>%MY%~^b|1!T zc8s!7n3)mW9CS10BGfK@6fRLRN1C*{b7W=CJM)vU7#XN8_hYMZyVV^y=FNtArh@p!!X1WtF2z*0gAd&;dg@U(Ey|02pl!?sgmPbBod=jer{AG2LB4_ZjSzV?;iz=-N#r(vL z(Gwxrs@6>7)zhMWJVypw6PnrZ*H#~7tqXZf>ht1mHp*HT@{WpD;@{=DK~y8Y(N2bPDNB8 zb~7$DE-^4L^m3s900MAHL_t(oN9~xwY7{{fMXO~7i4crgNC=sL8{LTDLjS-o5c~o6 zx)5B5pe|gA3jUM}!Cz1U;y9xi!7w^AUFEyC-Yb)W%EUylYw*I&?MYQP)2H9-s-y`b z*I}K~?5zHO!IP?3gFkj&GDGl8rxAQSu+!}9CWiCgE|*<4o8Q~G$vkuJBD17=2~OU> zVD`^$G82(Rw2hgQGBpRuyXN5h$(OIp)l2u8CDluC@7*)z>9sB9^Yy#TlJ1S4>XFvy zTr-i6>D!pQAIHp%YfqRZ)%%+9LI8FSwPW>DR*;&cZ=&-i&QT` zyK_`g^x?AkcyGd9j^QBhMcAo>JdNn1T(xF`t=uhacfLqQ(8!_AXw;oJNWH=6Vs>(n zwFh3HdI|dJoIZLNYpsEfI0PXE3&s7lDfnpLH1r~Mo?vk$`TX`Vb8UOT^z)xg))m4| ziyzbPL5r#5=v%0r#i!6t;u^fW*Jlo{++y}tFEex1OK|k&5p(@QT#MW3lo`;KJWxW~ z;kIwIl!5)>#-ne{t-*PwX*~SS+`RsPnXBF|wyw1913A(IIdSUJyjyi1N)guSax9&T z4p#NI@6f~Hh%TvSf{{piuj%KsA_!d=CCoC$T#VyfUO;|gOrOMYRWCu4aH0hpoyg6F zBy2S&bKyi<$yp5_SM?Lr(n{oPEwx&+8Z>e?kZSXUs-K`>q4QcxJ7gpEm&uuyfnanZ zqeY3`4E(!W4=0zeB(t4Y^vX()E~)bbi@TZO>xaw_pW<#KDf>Gj?F-ZYxBg65Z`@`s m-+r(wT7oYA$LjbObnX`^c3by-ODfd>0000uyGFn diff --git a/tools/DFBrowser/icons/level_change.png b/tools/DFBrowser/icons/level_change.png deleted file mode 100644 index 83fb11a09c3ef77bcb43b095dad626534de2d116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrkx8<5=cZcP}FVo7)Ob!1@J*w6hZkrl}2Ebxdd zW?8eR=RL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvQqG zT^vI!{HLDZ$a%nkhc&Q&T~Kod$LcRBU7{X}HD-PvIjrmyGX)D-l@EFt2=%ZiM>g#~ z@1DC-X76`_i3Xc1<=QmeP4pJ`uiE$6@R*JH;nn8!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP}NRP z7sn6_|JDiJyhjvxoUL#5Uc0zUvRybXWx;%}_fk2>UCXyzv$H%OUwmhFQ~8raI@KrN z=-komUc12l7w0L1x4YI&h+W;o#(GEKSJ%1Mo6`0)v7X1nJTm6WYhxn zL(L1H#_=9r;9?}znjuhaA?J5_f7r%L+#&qM+$Q?5e**+G1XzMD&q%KnVawyN2bPDNB8 zb~7$DE-^4L^m3s900DGKL_t(oN9~vaa)TfcMYT7|3A85@kCYQsPLLy|F7T7J{s1k> zj5NF%2PP9%{GVOW{<_k=hQ`3{6XtQfM7aEq-HAx9*l;h_-lHjBA;7%wk;!t4WgN1Vs_8%5M-w9v!7b zAY9{U+@%p?wz#)RGPsuQ?UzgFtenq2b~|ppf{n$@3J_b| z0+vO}Vpw}R`SuZ*R-I)g_4y+9qRl9Y*OH`^jm5d&SDtM#KwJT_kFVhRhIUghrQA>0 u6KirEVIX!(l2T}rAG*KI_*_Ke~I@10000NS%G}c0*}aI1_r*vAk26?e?C6cX+r#&{{iJ z_ncX;uS>VKi}hb_v0FDhZkbG*#$MJ`v{I+3pml2K0VM^Fm+$vTKle?$YrLkq^Tv+{ z2S24fKg}0uR?zvbiSKt;?533~x8ChKELYv|sAR*7oKKO4VI1oIuT9RCXMU-B1mQCp ztusHfIcbf+zxoGfe@e-|E7#<4HoSHsAh<`=N&ds5l3)eTNddE#C9PSkv1oB~-bx8= zd4c5)$a_QhR0p%NB?|VcI5Jskh;(e*<5{ROX94X*Ka)%XE1&rKYwp;Oybf*zc%gclxUbP tsbAu*Ea+U+%6rpW>VF(p79)3)|B2tuH|17N`U?zu22WQ%mvv4FO#m9eyOIC^ diff --git a/tools/DFBrowser/icons/search_cancel.png b/tools/DFBrowser/icons/search_cancel.png deleted file mode 100644 index 74ab69df6847b74cf85d3572d443d1954a27b4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstUx|zfk$L9 z0|Va?5N4dJ%_j{MlqzwJC<)F_D=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsH(%$ z#WBRf|LqhiPurf` zB9*B!Gg5s`+k7XQ9zJ*}Fqk3x#^GxJl?&f`{=1(xcRe>_-o(d~!vEE%F9o`Z!PC{x JWt~$(69AjaTtol> diff --git a/tools/DFBrowser/icons/treeline_backward.png b/tools/DFBrowser/icons/treeline_backward.png deleted file mode 100644 index 94ef3f60dd2b7dce3f392918d3cf915063dee76c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299 zcmV+u1?>8XP)N2bPDNB8 zb~7$DE-^4L^m3s900fUoL_t(IPnDE=P?S{|hrctWVprBxiF8AwlQ4s|-lz|2>q_Rk7 z|L8mOoA=z_=lz}Y&3p==Y)q`Cy#5xyWnCh6?^!|;stJs(LLXVqhOjc$hnC_cv+wo_ zw!~Eto^+b{lv>hr8>#uzgg&WSVz96jO;{;;bvN0Oae51u`98|X!_L3WT`iGT)WnDGNBMYd7S3}2OWAbU)*?LQGX(Cc zVPDxbwxrdg1n#Y4byOvbG+6XV6_;D@Gu87LqqG^kEurtOI>KZL zb?`JWXHx;1Fe9EjPP3!zI*KNug1MWEarDkb8&x4;PdmFO;hLy&W(F4EBBhcynI~N> z4lToeLk^$n^O+Y^f;PH}kYmj#vjU45v-|)vb?KPyJ?h3hTeP-ypz=P%#Fd${i4mXl z1{7fzff&4qlV=;dk3C<6#Q%=4UWPI{j(!e%Byf-`Vwfw|Q`~91+}eHY*`nm+MMi(( zjTj;s1JwvCtppC16Weu&v7QWd(o=V-nfCT}OeT{>m#^Jm!txlzR6XMTja{0kLrm~M zj9-g*N7lZ%1~F)<e` z%t}N!$00rnlVCpyb?3zi2PM!+ZqA5C%$518R9TRSwfZNrOHNQ*TiYYQL<3^suZR`L z5SlE6Iuo%V1u;888VN@@Ced$(0cEh)841~iSdxKo%SNoLK&&!gwK|2&oDz&iqebq& z97n9lMfjdacvT}j$`D!!SEpN?Tj^@(Jw6G=R)227RJiP(rUD^tBdf|4nt+de_i@h>N_kjUSFFw;33FonDbG z3`)Mm@cnI!IMmL_XFJ*W{AtQD-Fe>vdBMzE)J@pQ+?!Ji#Z{f9=zi`+m$8Y$U zKfGf3hrKW&GlmOmZna0eBDi-`)hjUmZc5VmgGua>Ok)O$9|E~j-e*k&VT?PnM6uAHZ002ov JPDHLkV1n0aS6u)A diff --git a/tools/DFBrowser/icons/treeline_forward.png b/tools/DFBrowser/icons/treeline_forward.png deleted file mode 100644 index 1b18e42caabdaa2d1e49b11e34a53f52be45969f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1307 zcmV+$1?2jPP)N2bPDNB8 zb~7$DE-^4L^m3s900fswL_t(IPnDE=OqW#{$KNwI)7Dx;mw{QDD2s9#l7!1igK0`$ zAQVec5ixLzD4@ti?uaOm$fO3Mk|17C#6S_b!w;e4B6v45l+Ymxn7A3AHemS z9vb#-1Gc^eEZACttDK*2N=qsB#uWNX22L*vn-& z$VIfsIsVi1(D2MAJ_#&lVN?a~iM7O@Zb6$DR?cLp#$rV}Kej#^2!B5NU7%hGMOdyr z%ED+J0ogavlzBXAj2p|mlLx~7pLINX%qwQDXzwIpWGkPIGIm3aTf+zo4~`es4TL?P zb$0hK%`pr$dMRp@3(CY@fTIOywh?9FkFxYdO_jEl_-R{20jQ4xFqyxN`YX5T>gqD6 zyStm#d+k^)jYUmbhZ?^gWxQNCNdla>K_H1rKvTU5U zWz*EuG^m;j4NUgjEAc5P=PW58Rf>s2*`;ALvjA=M=0?^CaHjMpqVXHSxHewf zeGl7AX^#)kU%Y1cAHHA}!=los*i`mmmfOSRf*!2PdYN9;%M9H!Y^t9b{Pc=m8UKy< z3Z7z`^Mo1YeJm>OVdw|Z2G}4_FJ&Icf}A#dt`#b}P!oh1AUi88odq|dMSyF~GiVO2>dCQC9H`G%d0 z{JmbUe|7$niRo;HTZi(l=P~T#YjOUjnb|vQF!wmhun$9cec~Jm`|mnH`x9jnTb_9+ RBSZiI002ovPDHLkV1oPYXO{o~ diff --git a/tools/DFBrowser/icons/treeline_update.png b/tools/DFBrowser/icons/treeline_update.png deleted file mode 100644 index 134d316403dd9747daa7ad2b544b41cd2a92aea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmV-T1hV^yP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1L8?UK~y+TV;~YR zLNWQkBX=Tu_Pk@dg`2J<=4`uHAG!8!mGk_|!NwiC%c7oYv|l0g009HHpNd?3X#g)2GDs@FQ%$JcX!b)x{F z&B?QOI~4D`e>(Bt>u*+@UVM{W`1}v&gs1!04LVXr4G_;|kyI)f04b`;){II>UKlW|Xrvn~Jrsg}kww29V1Q#4JF} z48*J)%5Jh;E*%$>I0%pdC>B8m zV2e#gVPSP%Zs)o}=BTxA8PfIv4LkOqq2|tihPGG#*^16!HIN|S)-f07h?}*Aq3-m5 zhVHBX8K&I*&#>^#f40s`M+J>T`Ju{)1Cqu*Ts$$ol}rtXJ~2$Z_Mc$}&~*zQ{byYL z@;~R~vls?4g_hJy_?NdUnCG`EsHe9p$j8?!h{sebiu>m)i0kQbi)fgt@pu*Va3u81 z;z*t_lOuh~bdKy9Q@IM~Oc6@yDv*(};DnmRz~Jf{!(F)b_-gNCPwwk%et2JU(cSwz z6RzH8t2uF>J8{+;aea3MpfXVSf;53JD9wQ|I}o!0F(?8NK;18i*K+HOVvB?f;B1r~j}At==f=(X0$qhBZ0K z+sA{vj+(bYE@UgceuSaq%|E8h$G;d-AO2@ZxbmMN>d1e_(4BwT0+t;S@b2-Ga;^~8 z(h6k*86s(&CMRN%9wuuN;>TcY%nCIM0+d|J`Pnnh9AQg3eU>L+X$4F4(fbV1C;l@; z?ElXYy6rzh$j1N7!K*&91us0#=|6oHyI1dKcIU>6JZ5S0`Q^+MfkvRZUd5xHPcUlD zBtfr*E;0JA{KF8m`aeS?(9nbf{~1z_{%1@+^p7QK?Hew~iYe@} zMxda;Qk2=-vxvJEivd}%*kt85O)=ndZth|CnsAOKc+qo~_^mHlQ}*8Ch+V&$+odLq zS4u+|sE(vUmytnIl8ax>Rgu>;){@6G$&OpsUze9x3S -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_AttributePane::DFBrowserPane_AttributePane() - : DFBrowserPane_AttributePaneAPI(), - myMainWidget(0), - myTableView(0) -{ - myPaneModel = new DFBrowserPane_AttributePaneModel(); - - getPaneModel()->SetColumnCount(getColumnCount()); - getPaneModel()->SetHeaderValues(getHeaderValues(Qt::Horizontal), Qt::Horizontal); - - mySelectionModels.push_back(new QItemSelectionModel(myPaneModel)); -} - -// ======================================================================= -// function : GetWidget -// purpose : -// ======================================================================= -QWidget* DFBrowserPane_AttributePane::GetWidget(QWidget* theParent, const bool isToCreate) -{ - if (!myMainWidget && isToCreate) - myMainWidget = CreateWidget(theParent); - return myMainWidget; -} - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -QWidget* DFBrowserPane_AttributePane::CreateWidget(QWidget* theParent) -{ - QWidget* aMainWidget = new QWidget(theParent); - aMainWidget->setVisible(false); - - myTableView = new DFBrowserPane_TableView(aMainWidget, getTableColumnWidths()); - myTableView->SetModel(myPaneModel); - QTableView* aTableView = myTableView->GetTableView(); - DFBrowserPane_AttributePaneModel* aPaneModel = - dynamic_cast(myPaneModel); - if (aPaneModel) - { - if (aPaneModel->GetOrientation() == Qt::Vertical) - aTableView->horizontalHeader()->setVisible( - !aPaneModel->HeaderValues(Qt::Horizontal).isEmpty()); - else - aTableView->verticalHeader()->setVisible(!aPaneModel->HeaderValues(Qt::Vertical).isEmpty()); - } - aTableView->setSelectionModel(mySelectionModels.front()); - aTableView->setSelectionBehavior(QAbstractItemView::SelectRows); - - QGridLayout* aLay = new QGridLayout(aMainWidget); - aLay->setContentsMargins(0, 0, 0, 0); - aLay->addWidget(myTableView); - - return aMainWidget; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePane::Init(const Handle(TDF_Attribute)& theAttribute) -{ - QList aValues; - GetValues(theAttribute, aValues); - getPaneModel()->Init(aValues); - - if (myTableView) - myTableView->GetTableView()->resizeColumnToContents(0); -} - -// ======================================================================= -// function : GetAttributeInfo -// purpose : -// ======================================================================= -QVariant DFBrowserPane_AttributePane::GetAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - int theRole, - int theColumnId) -{ - switch (theRole) - { - case DFBrowserPane_ItemRole_ShortInfo: { - QList aValues; - GetShortAttributeInfo(theAttribute, aValues); - QStringList anInfoList; - for (QList::const_iterator aValuesIt = aValues.begin(); aValuesIt != aValues.end(); - aValuesIt++) - anInfoList.append(aValuesIt->toString()); - return QVariant(anInfoList.join(", ")); - } - default: - return DFBrowserPane_AttributePane::GetAttributeInfoByType( - theAttribute.IsNull() ? "" : theAttribute->DynamicType()->Name(), - theRole, - theColumnId); - } -} - -// ======================================================================= -// function : GetShortAttributeInfo -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePane::GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - QList aValues; - GetValues(theAttribute, aValues); - - for (int aValuesEvenId = 1; aValuesEvenId < aValues.size(); aValuesEvenId = aValuesEvenId + 2) - theValues.append(aValues[aValuesEvenId]); -} - -// ======================================================================= -// function : GetAttributeInfoByType -// purpose : -// ======================================================================= -QVariant DFBrowserPane_AttributePane::GetAttributeInfoByType(Standard_CString theAttributeName, - int theRole, - int theColumnId) -{ - if (theColumnId != 0) - return QVariant(); - - switch (theRole) - { - case Qt::DisplayRole: - case Qt::ToolTipRole: - return QVariant(theAttributeName); - case Qt::DecorationRole: - return QIcon(":/icons/attribute.png"); - case DFBrowserPane_ItemRole_Decoration_40x40: - return QIcon(":/icons/attribute_40x40.png"); - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : getPaneModel -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneModel* DFBrowserPane_AttributePane::getPaneModel() const -{ - return dynamic_cast(myPaneModel); -} - -// ======================================================================= -// function : getTableColumnWidths -// purpose : -// ======================================================================= -QMap DFBrowserPane_AttributePane::getTableColumnWidths() const -{ - QMap aValues; - for (int aColumnId = 0, aCount = getPaneModel()->columnCount(); aColumnId < aCount; aColumnId++) - aValues.insert(aColumnId, DFBrowserPane_Tools::DefaultPanelColumnWidth(aColumnId)); - return aValues; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx deleted file mode 100644 index 9ce2793016..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx +++ /dev/null @@ -1,138 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_AttributePane_H -#define DFBrowserPane_AttributePane_H - -#include - -#include -#include -#include - -#include -#include -#include -#include - -class DFBrowserPane_AttributePaneModel; -class DFBrowserPane_TableView; - -class QAbstractTableModel; -class QItemSelectionModel; - -//! \class DFBrowserPane_AttributePane -//! \brief This is an extension of base attribute pane: -//! - GetWidget() creates table view, view model and selection model. Table is vertical with one -//! column. -//! - Init() obtains GetValues and give it to the table view model -//! If standard pane with such a table is used, only GetValues() should be redefined in children -class DFBrowserPane_AttributePane : public DFBrowserPane_AttributePaneAPI -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_AttributePane(); - - //! Destructor - virtual ~DFBrowserPane_AttributePane() {} - - //! Creates a new widget - //! \param theParent a parent widget - //! \return pane widget - Standard_EXPORT virtual QWidget* CreateWidget(QWidget* theParent); - - //! Creates widget if it was not created and isToCreate is true - //! \param theParent a parent widget - //! \param isToCreate flag if the widget should be created if it is NULL - //! \return pane widget - Standard_EXPORT virtual QWidget* GetWidget(QWidget* theParent, - const bool isToCreate) Standard_OVERRIDE; - - //! Gets values of attribute using GetValues() and Init the view model - //! \param theAttribute a current attribute - Standard_EXPORT virtual void Init(const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, QList& theValues) - { - (void)theAttribute; - (void)theValues; - }; - - //! Returns common information for the given attribute kind - //! \param theAttributeName a kind of attribute - //! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background - //! and so on) \param theColumnId a tree model column \return value, interpreted by tree model - //! depending on the role - Standard_EXPORT static QVariant GetAttributeInfoByType(Standard_CString theAttributeName, - int theRole, - int theColumnId); - - //! Returns information for the given attribute - //! \param theAttribute a current attribute - //! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background - //! and so on) \param theColumnId a tree model column \return value, interpreted by tree model - //! depending on the role - Standard_EXPORT virtual QVariant GetAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - int theRole, - int theColumnId); - - //! Returns brief attribute information. In general case, it returns even values of GetValues() - //! result. \param theAttribute a current attribute \param theValues a result list of values - Standard_EXPORT virtual void GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues); - - //! Returns list of selection models. In default implementation it contains a selection model for - //! the table view \returns container of models - virtual std::list GetSelectionModels() Standard_OVERRIDE - { - return mySelectionModels; - } - -protected: - //! Returns converted table view model - Standard_EXPORT DFBrowserPane_AttributePaneModel* getPaneModel() const; - - //! Returns converted table view - DFBrowserPane_TableView* getTableView() const { return myTableView; } - - //! Returns header text values for 0...n table cells in parameter orientation - //! \param theOrientation defines horizontal or vertical values - //! \param theValues output container of values - virtual QList getHeaderValues(const Qt::Orientation theOrientation) - { - (void)theOrientation; - return QList(); - } - - //! Returns number of columns in internal table. By default it returns 2 : method name for method - //! value. \return integer value - virtual int getColumnCount() const { return 2; } - - //! Defines widths of table columns - //! \return container of widths - Standard_EXPORT virtual QMap getTableColumnWidths() const; - -protected: - QWidget* myMainWidget; //!< widget created in this pane - DFBrowserPane_TableView* myTableView; //!< table for visualization of attribute parameters - QAbstractTableModel* - myPaneModel; //!< table view model. It is created before the table view, so we need to cache it - std::list mySelectionModels; //! selection models -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneAPI.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneAPI.hxx deleted file mode 100644 index 76e620f82d..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneAPI.hxx +++ /dev/null @@ -1,126 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_AttributePaneAPI_H -#define DFBrowserPane_AttributePaneAPI_H - -#include -#include -#include -#include -#include -#include - -#include - -class QWidget; -class QItemSelectionModel; - -//! \class DFBrowserPane_AttributePane -//! \brief This is a base class for attribute pane. It defines methods that should be redefined in -//! chindren. The kinds of information provided by the methods: -//! - widget, a control that should be shown for this kind of attribute -//! - Init method to fill control by the attribute context -//! - selection models that are active, the application can connect to the models to react to -//! selection change -//! - presentation/references/attribute references of attribute custom information about this -//! attribute -class DFBrowserPane_AttributePaneAPI -{ -public: - //! Constructor - DFBrowserPane_AttributePaneAPI() {} - - //! Destructor - virtual ~DFBrowserPane_AttributePaneAPI() {} - - //! Creates widget to visualize values of this kind of attribute - //! \param theParent a parent for the widget - //! \param isToCreate flag whether the widget should be created - virtual QWidget* GetWidget(QWidget* theParent, const bool isToCreate) - { - (void)theParent; - (void)isToCreate; - return 0; - } - - //! Initializes the content of the pane by the parameter attribute - //! \param theAttribute an OCAF attribute - virtual void Init(const Handle(TDF_Attribute)& theAttribute) { (void)theAttribute; }; - - //! Returns selections models of the pane, if the selection is possible in the pane controls - virtual std::list GetSelectionModels() - { - return std::list(); - } - - //! Returns selection kind for the model, it may be General selection or Additional selection for - //! example \param theModel one of selection models provided by this pane \return selection kind - virtual int GetSelectionKind(QItemSelectionModel* theModel) - { - (void)theModel; - return -1; - } - - //! Returns selection parameters, that may be useful for communicate between tools - //! \param theModel one of selection models provided by this pane - //! \theParameters a container of parameters, might be extended depending on the pane state(e.g. - //! selection) \theItemNames names to be selected for each selection parameter - virtual void GetSelectionParameters(QItemSelectionModel* theModel, - NCollection_List& theParameters, - NCollection_List& theItemNames) - { - (void)theModel; - (void)theParameters; - (void)theItemNames; - } - - //! Returns presentation of the attribute to be visualized in the view - //! \param theAttribute a current attribute - //! \return handle of presentation if the attribute has, to be visualized - virtual Handle(Standard_Transient) GetPresentation(const Handle(TDF_Attribute)& theAttribute) - { - (void)theAttribute; - return Handle(Standard_Transient)(); - } - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - { - (void)theAttribute; - (void)theRefLabels; - (void)theRefPresentation; - } - - //! Returns container of Attribute references to the attribute - //! \param theAttribute a current attribute - //! \param theRefAttributes a container of attribute references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - virtual void GetAttributeReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefAttributes, - Handle(Standard_Transient)& theRefPresentation) - { - (void)theAttribute; - (void)theRefAttributes; - (void)theRefPresentation; - } -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.cxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.cxx deleted file mode 100644 index bc5605b8ef..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.cxx +++ /dev/null @@ -1,61 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneAPI* DFBrowserPane_AttributePaneCreator::CreateAttributePane( - Standard_CString theAttributeName) -{ - DFBrowserPane_AttributePaneAPI* aPane = 0; - if (theAttributeName == STANDARD_TYPE(TDF_Reference)->Name()) - aPane = new DFBrowserPane_TDFReference(); - else if (theAttributeName == STANDARD_TYPE(TDataStd_TreeNode)->Name()) - aPane = new DFBrowserPane_TDataStdTreeNode(); - else if (theAttributeName == STANDARD_TYPE(TDataStd_ReferenceList)->Name()) - aPane = new DFBrowserPane_TDataStdReferenceList(); - else if (theAttributeName == STANDARD_TYPE(TDataStd_ReferenceArray)->Name()) - aPane = new DFBrowserPane_TDataStdReferenceArray(); - else if (theAttributeName == STANDARD_TYPE(TNaming_NamedShape)->Name()) - aPane = new DFBrowserPane_TNamingNamedShape(); - else if (theAttributeName == STANDARD_TYPE(TNaming_Naming)->Name()) - aPane = new DFBrowserPane_TNamingNaming(); - else if (theAttributeName == STANDARD_TYPE(TNaming_UsedShapes)->Name()) - aPane = new DFBrowserPane_TNamingUsedShapes(); - - return aPane; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.hxx deleted file mode 100644 index a91532b9da..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_AttributePaneCreator_H -#define DFBrowserPane_AttributePaneCreator_H - -#include -#include - -#include - -//! \class DFBrowserPane_AttributePaneCreator -//! \brief This class can creates attribute pane for attribute name. -class DFBrowserPane_AttributePaneCreator : public DFBrowserPane_AttributePaneCreatorAPI -{ -public: - //! Constructor - DFBrowserPane_AttributePaneCreator() - : DFBrowserPane_AttributePaneCreatorAPI() - { - } - - //! Destructor - virtual ~DFBrowserPane_AttributePaneCreator() Standard_OVERRIDE {} - -public: - //! Creates attribute pane for TDF, TDataStd, TDocStd, TPrsStd, TNaming and TFunction attribute - //! types \param theAttributeName a standard type of attribute \return an attribute pane if it can - //! be created for this type - Standard_EXPORT virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane( - Standard_CString theAttributeName) Standard_OVERRIDE; -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreatorAPI.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreatorAPI.hxx deleted file mode 100644 index 73881bf548..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneCreatorAPI.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_AttributePaneCreatorAPI_H -#define DFBrowserPane_AttributePaneCreatorAPI_H - -#include -#include - -class DFBrowserPane_AttributePaneAPI; - -//! \class DFBrowserPane_AttributePaneCreatorAPI -//! \brief An interface to create attribute panes by attribute name. -class DFBrowserPane_AttributePaneCreatorAPI -{ -public: - //! Constructor - DFBrowserPane_AttributePaneCreatorAPI() {} - - //! Destructor - virtual ~DFBrowserPane_AttributePaneCreatorAPI() {} - - //! Creates attribute pane for attribute types - //! \param theAttributeName a standard type of attribute - //! \return an attribute pane if it can be created for this type - virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane( - Standard_CString theAttributeName) = 0; -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx deleted file mode 100644 index bdf83756f6..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.cxx +++ /dev/null @@ -1,168 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneModel::DFBrowserPane_AttributePaneModel(QObject* theParent) - : QAbstractTableModel(theParent), - myOrientation(Qt::Vertical), - myColumnCount(1) -{ - myItalicColumns.append(0); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePaneModel::Init(const QList& theValues) -{ - myValuesMap.clear(); - - if (myOrientation == Qt::Vertical) - { - int aRows = theValues.size() / myColumnCount; - QList aRowValues; - int aValuesIndex = 0; - for (int aRowId = 0; aRowId < aRows; aRowId++) - { - aRowValues.clear(); - for (int aColumnId = 0; aColumnId < myColumnCount; aColumnId++) - { - aRowValues.append(theValues[aValuesIndex]); - aValuesIndex++; - } - myValuesMap[aRowId] = aRowValues; - } - } - else - { - int aCols = theValues.size() / myColumnCount; - QList aColValues; - int aValuesIndex = 0; - for (int aColumnId = 0; aColumnId < aCols; aColumnId++) - { - aColValues.clear(); - for (int aRowId = 0; aRowId < myColumnCount; aRowId++) - { - aColValues.append(theValues[aValuesIndex]); - aValuesIndex++; - } - myValuesMap[aColumnId] = aColValues; - } - } - emit layoutChanged(); -} - -// ======================================================================= -// function : SetHeaderValues -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePaneModel::SetHeaderValues(const QList& theValues, - Qt::Orientation theOrientation) -{ - if (theOrientation == Qt::Horizontal) - myHorizontalHeaderValues = theValues; - else - myVerticalHeaderValues = theValues; -} - -// ======================================================================= -// function : columnCount -// purpose : -// ======================================================================= -int DFBrowserPane_AttributePaneModel::columnCount(const QModelIndex& /* theParent*/) const -{ - return myOrientation == Qt::Vertical ? myColumnCount : myValuesMap.size(); -} - -// ======================================================================= -// function : rowCount -// purpose : -// ======================================================================= -int DFBrowserPane_AttributePaneModel::rowCount(const QModelIndex& /* theParent*/) const -{ - return myOrientation == Qt::Vertical ? myValuesMap.size() : myColumnCount; -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowserPane_AttributePaneModel::data(const QModelIndex& theIndex, int theRole) const -{ - QVariant aValue; - - if (theRole == Qt::DisplayRole) - { - if (myOrientation == Qt::Vertical) - { - int aRowId = theIndex.row(); - QList aRowValues = myValuesMap[aRowId]; - aValue = aRowValues.at(theIndex.column()); - } - else - { - int aColId = theIndex.column(); - QList aColValues = myValuesMap[aColId]; - aValue = aColValues.at(theIndex.row()); - } - } - if (myItalicColumns.contains(theIndex.column()) && theRole == Qt::FontRole) - { - QFont aFont = qApp->font(); - aFont.setItalic(true); - return aFont; - } - if (myItalicColumns.contains(theIndex.column()) && theRole == Qt::ForegroundRole) - return QColor(Qt::darkGray).darker(150); - - return aValue; -} - -// ======================================================================= -// function : headerData -// purpose : -// ======================================================================= -QVariant DFBrowserPane_AttributePaneModel::headerData(int theSection, - Qt::Orientation theOrientation, - int theRole) const -{ - QVariant aValue = QAbstractTableModel::headerData(theSection, theOrientation, theRole); - if (theRole == Qt::DisplayRole) - { - if (theOrientation == Qt::Horizontal) - { - if (!myHorizontalHeaderValues.empty() && theSection < myHorizontalHeaderValues.size()) - aValue = myHorizontalHeaderValues[theSection]; - } - else - { // vertical - if (!myVerticalHeaderValues.empty() && theSection < myVerticalHeaderValues.size()) - aValue = myVerticalHeaderValues[theSection]; - } - } - return aValue; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx deleted file mode 100644 index d5f5a6693c..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx +++ /dev/null @@ -1,125 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_AttributePaneModel_H -#define DFBrowserPane_AttributePaneModel_H - -#include -#include - -#include -#include -#include -#include -#include - -//! \class DFBrowserPane_AttributePaneModel -//! \brief This is an extension of table model to visualize a container of values -//! It is possible to: -//! - set orientation to interpret the values. -//! - set table view header values. -//! Items of the view are enabled and selectable. -class DFBrowserPane_AttributePaneModel : public QAbstractTableModel -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_AttributePaneModel(QObject* theParent = 0); - - //! Destructor - virtual ~DFBrowserPane_AttributePaneModel() {} - - //! Sets direction of the values applying, whether it should be placed by rows or by columns - //! \param theOrientation if horizontal, the values are applied by rows, otherwise by columns - void SetOrientation(const Qt::Orientation& theOrientation) { myOrientation = theOrientation; } - - //! Returns table orientation for setting data values - //! \return thye current orientation - Qt::Orientation GetOrientation() const { return myOrientation; } - - //! Sets number of columns - //! \param theColumnCount a column count - void SetColumnCount(const int theColumnCount) { myColumnCount = theColumnCount; } - - //! Fills the model with the values. Store the values in a cache. - //! \param theValues a container of values - Standard_EXPORT void Init(const QList& theValues); - - //! Fills the model header values for orientation. - //! \param theValues a container of header text values - //! \param theOrientation an orientation of header - Standard_EXPORT void SetHeaderValues(const QList& theValues, - Qt::Orientation theOrientation); - - //! Returns header values for orientation. - //! \param theValues a container of header text values - //! \param theOrientation an orientation of header - const QList& HeaderValues(Qt::Orientation theOrientation) - { - return theOrientation == Qt::Horizontal ? myHorizontalHeaderValues : myVerticalHeaderValues; - } - - //! Returns indices of italic columns - //! \return indices of columns - const QList& GetItalicColumns() const { return myItalicColumns; } - - //! Sets indices of italic columns - //! \param theValues indices of columns - void SetItalicColumns(const QList& theValues) { myItalicColumns = theValues; } - - //! Returns number of columns, depending on orientation: myColumnCount or size of values container - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns number of rows, depending on orientation: myColumnCount or size of values container - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns content of the model index for the given role, it is obtained from internal container - //! of values It returns value only for DisplayRole. \param theIndex a model index \param theRole - //! a view role \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns content of the model index for the given role, it is obtainer from internal container - //! of header values It returns value only for DisplayRole. \param theSection an index of value in - //! the container \param theIndex a model index \param theRole a view role \return value - //! interpreted depending on the given role - Standard_EXPORT virtual QVariant headerData(int theSection, - Qt::Orientation theOrientation, - int theRole = Qt::DisplayRole) const - Standard_OVERRIDE; - - //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable - //! \param theIndex a model index - //! \return flags - virtual Qt::ItemFlags flags(const QModelIndex& theIndex) const Standard_OVERRIDE - { - return theIndex.isValid() ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags; - } - -private: - Qt::Orientation myOrientation; //!< orientation how the values should fill the current table view - int myColumnCount; //!< number of table columns - QMap> myValuesMap; //!< container of values, filled in Init(), used in data() - QList myHorizontalHeaderValues; //!< table horizontal header values - QList myVerticalHeaderValues; //!< table vertical header values - QList myItalicColumns; //!< indices of columns that should be visualized in gray and italic -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.cxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.cxx deleted file mode 100644 index 0ff46304a5..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.cxx +++ /dev/null @@ -1,94 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneSelector::DFBrowserPane_AttributePaneSelector(QObject* theParent) - : QObject(theParent), - mySendSelectionChangeBlocked(false) -{ -} - -// ======================================================================= -// function : Destructor -// purpose : -// ======================================================================= -DFBrowserPane_AttributePaneSelector::~DFBrowserPane_AttributePaneSelector() -{ - SetCurrentSelectionModels(std::list()); -} - -// ======================================================================= -// function : SetCurrentSelectionModels -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePaneSelector::SetCurrentSelectionModels( - const std::list& theModels) -{ - for (std::list::const_iterator anModelsIt = mySelectionModels.begin(), - aLast = mySelectionModels.end(); - anModelsIt != aLast; - anModelsIt++) - disconnect(*anModelsIt, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&))); - - mySelectionModels = theModels; - for (std::list::const_iterator anModelsIt = mySelectionModels.begin(), - aLast = mySelectionModels.end(); - anModelsIt != aLast; - anModelsIt++) - connect(*anModelsIt, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&))); -} - -// ======================================================================= -// function : ClearSelected -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePaneSelector::ClearSelected() -{ - mySendSelectionChangeBlocked = true; - for (std::list::const_iterator anModelsIt = mySelectionModels.begin(), - aLast = mySelectionModels.end(); - anModelsIt != aLast; - anModelsIt++) - (*anModelsIt)->clearSelection(); - mySendSelectionChangeBlocked = false; -} - -// ======================================================================= -// function : -// purpose : -// ======================================================================= -void DFBrowserPane_AttributePaneSelector::onTableSelectionChanged( - const QItemSelection& theSelected, - const QItemSelection& theDeselected) -{ - if (mySendSelectionChangeBlocked) - return; - - QItemSelectionModel* aModel = (QItemSelectionModel*)sender(); - emit tableSelectionChanged(theSelected, theDeselected, aModel); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.hxx b/tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.hxx deleted file mode 100644 index 817fc045c7..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_AttributePaneSelector.hxx +++ /dev/null @@ -1,72 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_AttributePaneSelector_H -#define DFBrowserPane_AttributePaneSelector_H - -#include - -#include -#include -#include -#include - -#include - -class QItemSelectionModel; - -//! \class DFBrowserPane_AttributePaneSelector -//! \brief Container of active selection models. It connects to selection changed signal of the -//! models and emits one signal for any selection. -class DFBrowserPane_AttributePaneSelector : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowserPane_AttributePaneSelector(QObject* theParent); - - //! Destructor - Standard_EXPORT virtual ~DFBrowserPane_AttributePaneSelector(); - - //! Fills the pane selection by the given models. Disconnect it from the previous model and - //! connect to new models \param theModels a list of selection models - Standard_EXPORT void SetCurrentSelectionModels(const std::list& theModels); - - //! Clears selection in all selection models using block for selection changed flag - Standard_EXPORT void ClearSelected(); - -signals: - - //! Signal about selection changed in the model - //! \param theSelected selected items - //! \param theDeselected deselected items - //! \param theModel a selection model where the selection happens - void tableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected, - QItemSelectionModel* theModel); -protected slots: - - //! Listens selectionChanged() of the model and emits signal tableSelectionChanged filled with the - //! selection model \param theSelected selected items \param theDeselected deselected items - void onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -private: - std::list mySelectionModels; //!< container of selection models - bool mySendSelectionChangeBlocked; //!< flag is selection processing should not performed, avoid - //!< cyclic dependency -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx b/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx deleted file mode 100644 index 0a49833ea2..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_HelperArray.cxx +++ /dev/null @@ -1,94 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_HelperArray::DFBrowserPane_HelperArray( - DFBrowserPane_AttributePaneModel* theValuesModel) - : myValuesModel(theValuesModel), - myArrayBounds(0), - myValuesView(0) -{ - myBoundsModel = new DFBrowserPane_AttributePaneModel(); - myBoundsModel->SetColumnCount(2); -} - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -void DFBrowserPane_HelperArray::CreateWidget(QWidget* theParent, - DFBrowserPane_TableView* theValuesView) -{ - myValuesView = theValuesView; - myArrayBounds = new DFBrowserPane_TableView(theParent); - myArrayBounds->SetModel(myBoundsModel); - DFBrowserPane_TableView::SetFixedRowCount(2, myArrayBounds->GetTableView()); - - QGridLayout* aLay = new QGridLayout(theParent); - aLay->setContentsMargins(0, 0, 0, 0); - aLay->addWidget(myArrayBounds); - aLay->addWidget(theValuesView); - aLay->setRowStretch(1, 1); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_HelperArray::Init(const QList& theValues) -{ - QList aTmpValues; - aTmpValues << "Lower" << theValues[0] << "Upper" << theValues[1]; - myBoundsModel->Init(aTmpValues); - - aTmpValues.clear(); - int aLower = theValues[0].toInt(); - for (int aValueIt = 2, aSize = theValues.size(); aValueIt < aSize; aValueIt++) - aTmpValues << QString("Value (%1)").arg(aValueIt - 2 + aLower) << theValues[aValueIt]; - myValuesModel->Init(aTmpValues); - - if (myArrayBounds) - myArrayBounds->GetTableView()->resizeColumnToContents(0); - if (myValuesView) - myValuesView->GetTableView()->resizeColumnToContents(0); -} - -// ======================================================================= -// function : GetShortAttributeInfo -// purpose : -// ======================================================================= -void DFBrowserPane_HelperArray::GetShortAttributeInfo(const Handle(TDF_Attribute)& /*theAttribute*/, - QList& theValues) -{ - for (int aRowId = 0, aRows = myValuesModel->rowCount(); aRowId < aRows; aRowId++) - theValues.append(myValuesModel->data(myValuesModel->index(aRowId, 1))); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx b/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx deleted file mode 100644 index 04499dcc05..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_HelperArray.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_HelperArray_H -#define DFBrowserPane_HelperArray_H - -#include -#include - -class DFBrowserPane_AttributePaneModel; -class DFBrowserPane_TableView; - -class QWidget; - -#include -#include -#include -#include - -//! \class DFBrowserPane_HelperArray -//! \brief Class that is used for list and array attributes. Two tables, the first for bounds, the -//! second for values. Bound table contains two values: Lower and Upper values of the container. So, -//! the first and the second values in GetValue() are these bounds, other values are used to fill -//! usual table view. -class DFBrowserPane_HelperArray -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_HelperArray(DFBrowserPane_AttributePaneModel* theValuesModel); - - //! Destructor - virtual ~DFBrowserPane_HelperArray() {} - - //! Creates bounds table view and grid layout, where the bounds view and the values view are shown - //! \param theParent a parent widget - //! \param theValuesView a view of values(table view filled by myValuesModel) - Standard_EXPORT void CreateWidget(QWidget* theParent, DFBrowserPane_TableView* theValuesView); - - //! Fills bounds model by first and second values, fills values model by left values - //! \param theValues values to fill views - Standard_EXPORT void Init(const QList& theValues); - - //! Returns only values of values view model - //! \param theAttribute a current attribute - //! \param theValues a container of result values - Standard_EXPORT virtual void GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues); - -private: - DFBrowserPane_AttributePaneModel* myValuesModel; //!< model of table view - DFBrowserPane_AttributePaneModel* myBoundsModel; //!< model of bounds view - DFBrowserPane_TableView* myArrayBounds; //!< bounds view - DFBrowserPane_TableView* myValuesView; //!< values view -}; -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx b/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx deleted file mode 100644 index 2c8f1d97d6..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_HelperExport.cxx +++ /dev/null @@ -1,74 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : AddShape -// purpose : -// ======================================================================= -void DFBrowserPane_HelperExport::AddShape(const TopoDS_Shape& theShape, - const QModelIndexList& theIndices) -{ - for (int anIndicesIt = 0, aCount = theIndices.size(); anIndicesIt < aCount; anIndicesIt++) - myShapes[theIndices[anIndicesIt]] = theShape; -} - -// ======================================================================= -// function : OnButtonPressed -// purpose : -// ======================================================================= -void DFBrowserPane_HelperExport::OnButtonPressed(const QModelIndex& theIndex) -{ - if (!myShapes.contains(theIndex)) - return; - - const TopoDS_Shape& aShape = myShapes[theIndex]; - - if (aShape.IsNull()) - return; - - QString aFileExtension = ".brep"; - -#if QT_VERSION < 0x050000 - QString aFilter(tr("BREP file (*%1*)").arg(aFileExtension)); -#else - QString aFilter; -#endif - QString aSelectedFilter; - QString aFileName = QFileDialog::getSaveFileName(0, - tr("Export shape to BREP file"), - QString(), - aFilter, - &aSelectedFilter); - if (!aFileName.isEmpty()) - { - QApplication::setOverrideCursor(Qt::WaitCursor); - if (aFileName.indexOf(aFileExtension) < 0) - aFileName += QString(aFileExtension); - - const TCollection_AsciiString anAsciiName(aFileName.toUtf8().data()); - BRepTools::Write(aShape, anAsciiName.ToCString()); - QApplication::restoreOverrideCursor(); - } -} diff --git a/tools/DFBrowserPane/DFBrowserPane_HelperExport.hxx b/tools/DFBrowserPane/DFBrowserPane_HelperExport.hxx deleted file mode 100644 index 7fe9f653d5..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_HelperExport.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_HelperExport_H -#define DFBrowserPane_HelperExport_H - -#include - -#include -#include -#include -#include - -//! \class DFBrowserPane_HelperExport -//! \brief It performs export to BREP of a shape by button is pressed -//! It contains a container of shapes for model indices. If button is pressed for index where the -//! shape exists, this shape is exported to BREP file. -//! It contains a container of shapes, it is important to clear this helper after using. -class DFBrowserPane_HelperExport : public QObject -{ - Q_OBJECT -public: - //! Constructor - DFBrowserPane_HelperExport(QObject* theParent) { (void)theParent; } - - //! Destructor - virtual ~DFBrowserPane_HelperExport() Standard_OVERRIDE {} - - //! Clears current shapes - void Clear() { myShapes.clear(); } - - //! Append a shape to be exported if pressed button on item from the given list - //! \param theShape a shape - //! \param theIndicies a list of indices for this shape - void AddShape(const TopoDS_Shape& theShape, const QModelIndexList& theIndices); - - //! Returns whether the map of shapes contains a shape for the index - //! \param theIndex a model index - //! \return true if the map contains shape - bool HasShape(const QModelIndex& theIndex) const { return myShapes.contains(theIndex); } - - //! Returns shape for the index - //! \param theIndex a model view index - //! \return a cached shape - const TopoDS_Shape& Shape(const QModelIndex& theIndex) { return myShapes[theIndex]; } - -public slots: - - //! Slot that processing button press for the model index - //! \param theIndex a model index - void OnButtonPressed(const QModelIndex& theIndex); - -private: -#ifdef _MSC_VER - #pragma warning( \ - push, \ - 0) // 4251: class 'QMap' needs to have dll-interface... -#endif - QMap myShapes; //!< a container of shapes -#ifdef _MSC_VER - #pragma warning(pop) -#endif -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.cxx b/tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.cxx deleted file mode 100644 index cd74e066bc..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -const int ICON_SIZE = 20; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_ItemDelegateButton::DFBrowserPane_ItemDelegateButton(QObject* theParent, - const QString& theIcon) - : QStyledItemDelegate(theParent) -{ - myIcon = QIcon(theIcon); -} - -// ======================================================================= -// function : paint -// purpose : -// ======================================================================= -void DFBrowserPane_ItemDelegateButton::paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const -{ - if (myFreeRows.contains(theIndex.row())) - return; - - int aWidth = std::min(theOption.rect.width(), ICON_SIZE); - int aHeight = std::min(theOption.rect.height(), ICON_SIZE); - QPoint aTopLeft = theOption.rect.topLeft(); - thePainter->drawPixmap( - QRect(theOption.rect.topLeft(), QPoint(aTopLeft.x() + aWidth, aTopLeft.y() + aHeight)), - myIcon.pixmap(ICON_SIZE, ICON_SIZE)); -} - -// ======================================================================= -// function : editorEvent -// purpose : -// ======================================================================= -bool DFBrowserPane_ItemDelegateButton::editorEvent(QEvent* theEvent, - QAbstractItemModel* theModel, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) -{ - if (theEvent->type() == QEvent::MouseButtonPress && !myFreeRows.contains(theIndex.row())) - emit buttonPressed(theIndex); - - return QStyledItemDelegate::editorEvent(theEvent, theModel, theOption, theIndex); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.hxx b/tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.hxx deleted file mode 100644 index c524d87b2f..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_ItemDelegateButton.hxx +++ /dev/null @@ -1,83 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_ItemDelegateButton_H -#define DFBrowserPane_ItemDelegateButton_H - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -class QObject; -class QPainter; -class QEvent; -class QAbstractItemModel; - -//! \class DFBrowserPane_ItemDelegateButton -//! \brief It paints an icon in all rows of the view in a separate column. -//! It is possible to set rows where this icon is not shown. -//! Click on the cell where the icon exists emits buttonPressed signal -class DFBrowserPane_ItemDelegateButton : public QStyledItemDelegate -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowserPane_ItemDelegateButton(QObject* theParent, const QString& theIcon); - - //! Destructor - virtual ~DFBrowserPane_ItemDelegateButton() {} - -public: - //! Stores indices of rows where the icon should not be shown - //! \param theRows an indices of rows - void SetFreeRows(const QList& theRows) { myFreeRows = theRows; } - - //! Draw an icon in the cell - //! \param thePainter a painter - //! \param theOption a paint options - //! \param theIndex a view index - Standard_EXPORT virtual void paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Emits pressed signal if event type is mouse button pressed and there is icon for this index - //! After signal it calls the parent method - //! \param theEvent a processed event - //! \param theModel a current view model - //! \param theOption display options - //! \param theIndex an edited item - Standard_EXPORT virtual bool editorEvent(QEvent* theEvent, - QAbstractItemModel* theModel, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) Standard_OVERRIDE; -signals: - - //! Signal about button pressing - //! \param theIndex an index of clicked item - void buttonPressed(const QModelIndex& theIndex); - -private: - QIcon myIcon; //!< an item icon - QList myFreeRows; //!< container of row indices where icon is not used -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx b/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx deleted file mode 100644 index f5f1c8c5ed..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_ItemRole.hxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_ItemRole_H -#define DFBrowserPane_ItemRole_H - -#include - -//! Custom item role for attribute pane -enum DFBrowserPane_ItemRole -{ - DFBrowserPane_ItemRole_ShortInfo = - TreeModel_ItemRole_LastTreeRole + 1, //!< not full information of an attribute - DFBrowserPane_ItemRole_Decoration_40x40, //!< icon with greater size - DFBrowserPane_ItemRole_DisplayExtended, // extended item information (with additional information) - // for Qt::DisplayRole - DFBrowserPane_ItemRole_ToolTipExtended, // extended tool tip information for Qt::ToolTipRole - DFBrowserPane_ItemRole_LastTreeRole //! last enumeration value to use outside incremented -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx b/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx deleted file mode 100644 index 576e250e72..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_OcctEnumType.hxx +++ /dev/null @@ -1,34 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_OcctEnumType_H -#define DFBrowserPane_OcctEnumType_H - -//! Information for OCCT enumeration type -enum DFBrowserPane_OcctEnumType -{ - DB_CONSTRAINT_TYPE = 0, //!< TDataXtd_ConstraintEnum values - DB_NAMING_TYPE = 1, //!< TNaming_NameType values - DB_SHAPE_TYPE = 2, //!< TopAbs_ShapeEnum values - DB_NS_TYPE = 3, //!< TNaming_Evolution values - DB_GEOM_TYPE = 4, //!< TDataXtd_GeometryEnum values - DB_DIMENSION_TYPE = 5, //!< TDataStd_RealEnum values - DB_MATERIAL_TYPE = 6, //!< Graphic3d_NameOfMaterial values - DB_DISPLAY_MODE = 7, //!< AIS_DisplayMode values - DB_ORIENTATION_TYPE = 8, //!< TopAbs_Orientation values - DB_CDM_CAN_CLOSE_STATUS //!< CDM_CanCloseStatus values -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_SelectionKind.hxx b/tools/DFBrowserPane/DFBrowserPane_SelectionKind.hxx deleted file mode 100644 index ba053b090e..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_SelectionKind.hxx +++ /dev/null @@ -1,28 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_SelectionKind_H -#define DFBrowserPane_SelectionKind_H - -//! Selection kinds returned by attribute pane -enum DFBrowserPane_SelectionKind -{ - DFBrowserPane_SelectionKind_ExportToBREP, //!< Click on "Export to BREP" button - DFBrowserPane_SelectionKind_ExportToShapeViewer, //!< Click on "Export to ShapeViewer" button - DFBrowserPane_SelectionKind_LabelReferences, //!< Select label's reference (reserved) - DFBrowserPane_SelectionKind_AttributeReferences //!< Select Attribute reference (reserved) -}; - -#endif // _DFBrowserPane_SelectionKind_H diff --git a/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx b/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx deleted file mode 100644 index bba3c5e6f1..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDFReference.cxx +++ /dev/null @@ -1,61 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : GetValues -// purpose : -// ======================================================================= -void DFBrowserPane_TDFReference::GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TDF_Reference) anAttribute = Handle(TDF_Reference)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - TDF_Label aLabel = anAttribute->Get(); - theValues.append("Get"); - theValues.append(DFBrowserPane_Tools::GetEntry(aLabel).ToCString()); -} - -// ======================================================================= -// function : GetReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TDFReference::GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& /*theRefPresentation*/) -{ - Handle(TDF_Reference) anAttribute = Handle(TDF_Reference)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - QTableView* aTableView = getTableView()->GetTableView(); - QItemSelectionModel* aSelectionModel = aTableView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - if (aSelectedIndices.size() > 0) - theRefLabels.Append(anAttribute->Get()); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDFReference.hxx b/tools/DFBrowserPane/DFBrowserPane_TDFReference.hxx deleted file mode 100644 index 07443dea89..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDFReference.hxx +++ /dev/null @@ -1,50 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TDFReference_H -#define DFBrowserPane_TDFReference_H - -#include - -#include - -//! \class DFBrowserPane_TDFReference -//! \brief The class to manipulate of TDF_Reference attribute -class DFBrowserPane_TDFReference : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - DFBrowserPane_TDFReference() {} - - //! Destructor - virtual ~DFBrowserPane_TDFReference() {} - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - Standard_EXPORT virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - Standard_OVERRIDE; -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx deleted file mode 100644 index 390cf8b6ff..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.cxx +++ /dev/null @@ -1,117 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -QWidget* DFBrowserPane_TDataStdReferenceArray::CreateWidget(QWidget* theParent) -{ - QWidget* aMainWidget = new QWidget(theParent); - myTableView = new DFBrowserPane_TableView(aMainWidget); - myTableView->SetModel(getPaneModel()); - myTableView->GetTableView()->setSelectionModel(mySelectionModels.front()); - - myArrayTableHelper.CreateWidget(aMainWidget, myTableView); - - return aMainWidget; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdReferenceArray::Init(const Handle(TDF_Attribute)& theAttribute) -{ - QList aValues; - GetValues(theAttribute, aValues); - myArrayTableHelper.Init(aValues); -} - -// ======================================================================= -// function : GetValues -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdReferenceArray::GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TDataStd_ReferenceArray) anAttribute = - Handle(TDataStd_ReferenceArray)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - theValues.append(anAttribute->Lower()); - theValues.append(anAttribute->Upper()); - for (int aValueId = anAttribute->Lower(); aValueId <= anAttribute->Upper(); aValueId++) - theValues.append(DFBrowserPane_Tools::GetEntry(anAttribute->Value(aValueId)).ToCString()); -} - -// ======================================================================= -// function : GetShortAttributeInfo -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdReferenceArray::GetShortAttributeInfo( - const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - QList aValues; - GetValues(theAttribute, aValues); - myArrayTableHelper.Init(aValues); - return myArrayTableHelper.GetShortAttributeInfo(theAttribute, theValues); -} - -// ======================================================================= -// function : GetReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdReferenceArray::GetReferences( - const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& /*theRefPresentation*/) -{ - if (!getTableView()) - return; - QStringList aSelectedEntries = - DFBrowserPane_TableView::GetSelectedColumnValues(getTableView()->GetTableView(), 1); - - Handle(TDataStd_ReferenceArray) anAttribute = - Handle(TDataStd_ReferenceArray)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - for (int aValueId = anAttribute->Lower(); aValueId <= anAttribute->Upper(); aValueId++) - { - TDF_Label aLabel = anAttribute->Value(aValueId); - if (aSelectedEntries.contains(DFBrowserPane_Tools::GetEntry(aLabel).ToCString())) - theRefLabels.Append(aLabel); - } -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.hxx deleted file mode 100644 index 47983db2fa..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceArray.hxx +++ /dev/null @@ -1,73 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TDataStdReferenceArray_H -#define DFBrowserPane_TDataStdReferenceArray_H - -#include -#include - -#include - -//! \class DFBrowserPane_TDataStdReferenceArray -//! \brief The class to manipulate of TDataStd_ReferenceArray attribute -class DFBrowserPane_TDataStdReferenceArray : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TDataStdReferenceArray() - : DFBrowserPane_AttributePane(), - myArrayTableHelper(getPaneModel()) - { - } - - //! Destructor - Standard_EXPORT virtual ~DFBrowserPane_TDataStdReferenceArray() {} - - //! Creates table view and call create widget of array table helper - //! \param theParent a parent widget - //! \return a new widget - Standard_EXPORT virtual QWidget* CreateWidget(QWidget* theParent) Standard_OVERRIDE; - - //! Calls Init of array table helper - //! \param theAttribute a current attribute - Standard_EXPORT virtual void Init(const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns short attribute information using array table helper - //! \param theAttribute a current attribute - //! \param theValues container of output values - Standard_EXPORT virtual void GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - Standard_EXPORT virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - Standard_OVERRIDE; - -private: - DFBrowserPane_HelperArray myArrayTableHelper; //!< common interface to fill array pane -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx deleted file mode 100644 index d61e70c2ff..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : GetValues -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdReferenceList::GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TDataStd_ReferenceList) anAttribute = - Handle(TDataStd_ReferenceList)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - for (TDF_ListIteratorOfLabelList aLabelIt(anAttribute->List()); aLabelIt.More(); aLabelIt.Next()) - { - theValues.append("Value"); - theValues.append(DFBrowserPane_Tools::GetEntry(aLabelIt.Value()).ToCString()); - } -} - -// ======================================================================= -// function : GetReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdReferenceList::GetReferences( - const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& /*theRefPresentation*/) -{ - QStringList aSelectedEntries = - DFBrowserPane_TableView::GetSelectedColumnValues(getTableView()->GetTableView(), 1); - Handle(TDataStd_ReferenceList) anAttribute = - Handle(TDataStd_ReferenceList)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - for (TDF_ListIteratorOfLabelList aLabelIt(anAttribute->List()); aLabelIt.More(); aLabelIt.Next()) - { - const TDF_Label& aLabel = aLabelIt.Value(); - if (aSelectedEntries.contains(DFBrowserPane_Tools::GetEntry(aLabel).ToCString())) - theRefLabels.Append(aLabel); - } -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.hxx deleted file mode 100644 index 5d69f01a5f..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdReferenceList.hxx +++ /dev/null @@ -1,50 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TDataStdReferenceList_H -#define DFBrowserPane_TDataStdReferenceList_H - -#include - -#include - -//! \class DFBrowserPane_TDataStdReferenceList -//! \brief The class to manipulate of TDataStd_ReferenceList attribute -class DFBrowserPane_TDataStdReferenceList : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - DFBrowserPane_TDataStdReferenceList() {} - - //! Destructor - virtual ~DFBrowserPane_TDataStdReferenceList() {} - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - Standard_EXPORT virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - Standard_OVERRIDE; -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx deleted file mode 100644 index 32be226eb7..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx +++ /dev/null @@ -1,192 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_TDataStdTreeNode::DFBrowserPane_TDataStdTreeNode() - : DFBrowserPane_AttributePane(), - myTreeNodeView(0) -{ - myModel = new DFBrowserPane_TDataStdTreeNodeModel(0); - myModel->InitColumns(); - mySelectionModels.clear(); // do not use selection model of parent pane - mySelectionModels.push_back(new QItemSelectionModel(myModel)); -} - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -QWidget* DFBrowserPane_TDataStdTreeNode::CreateWidget(QWidget* theParent) -{ - QWidget* aMainWidget = new QWidget(theParent); - aMainWidget->setVisible(false); - - myTableView = new DFBrowserPane_TableView(aMainWidget, getTableColumnWidths()); - myTableView->SetVisibleHorizontalHeader(false); - DFBrowserPane_TableView::SetFixedRowCount(1, myTableView->GetTableView()); - myTableView->SetModel(myPaneModel); - - QVBoxLayout* aLay = new QVBoxLayout(aMainWidget); - aLay->setContentsMargins(0, 0, 0, 0); - aLay->addWidget(myTableView); - - myTreeNodeView = new QTreeView(theParent); - myTreeNodeView->header()->setVisible(false); - myTreeNodeView->setModel(myModel); - myTreeNodeView->setSelectionModel(mySelectionModels.front()); - myTreeNodeView->setSelectionBehavior(QAbstractItemView::SelectRows); - - aLay->addWidget(myTreeNodeView); - aLay->setStretch(1, 1); - return aMainWidget; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNode::Init(const Handle(TDF_Attribute)& theAttribute) -{ - Handle(TDataStd_TreeNode) aTreeNode = Handle(TDataStd_TreeNode)::DownCast(theAttribute); - - bool aDefaultGUID = aTreeNode->ID() != aTreeNode->GetDefaultTreeID(); - if (myTableView) - myTableView->setVisible(!aDefaultGUID); - - if (!aDefaultGUID) - { - QList aValues; - char aStr[256]; - aTreeNode->ID().ToCString(aStr); - TCollection_AsciiString aString(aStr); - aValues << "GetDefaultTreeID" << DFBrowserPane_Tools::ToString(aString); - getPaneModel()->Init(aValues); - if (myTableView) - myTableView->GetTableView()->resizeColumnToContents(0); - } - - myModel->Reset(); - - if (!aTreeNode.IsNull()) - { - Handle(TDataStd_TreeNode) aRootItem = aTreeNode->Root(); - myModel->SetAttribute(aRootItem); - - QModelIndex anIndex = myModel->FindIndex(theAttribute, QModelIndex()); - if (myTreeNodeView && anIndex.isValid()) - { - myTreeNodeView->setExpanded(anIndex.parent(), true); - myTreeNodeView->scrollTo(anIndex); - - TreeModel_ItemBasePtr anAttributeItem = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowserPane_TDataStdTreeNodeItemPtr anAttributeNodeItem = - itemDynamicCast(anAttributeItem); - anAttributeNodeItem->setCurrentAttribute(true); - } - } - myModel->EmitLayoutChanged(); -} - -// ======================================================================= -// function : GetShortAttributeInfo -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNode::GetShortAttributeInfo( - const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TDataStd_TreeNode) aTNAttribute = Handle(TDataStd_TreeNode)::DownCast(theAttribute); - bool aDefaultGUID = aTNAttribute->ID() != aTNAttribute->GetDefaultTreeID(); - QString aGUIDPrefix; - if (!aDefaultGUID) - { - QList aValues; - char aStr[256]; - aTNAttribute->ID().ToCString(aStr); - TCollection_AsciiString aString(aStr); - aGUIDPrefix = DFBrowserPane_Tools::ToString(aString); - } - - if (aTNAttribute->HasFather()) - { - TDF_Label aLabel = aTNAttribute->Father()->Label(); - theValues.append( - QString("%1 ==> %2").arg(aGUIDPrefix).arg(DFBrowserPane_Tools::GetEntry(aLabel).ToCString())); - } - else - { - Handle(TDataStd_TreeNode) aFirstChild = aTNAttribute->First(); - QStringList aRefs; - while (!aFirstChild.IsNull()) - { - TDF_Label aLabel = aFirstChild->Label(); - aRefs.append(DFBrowserPane_Tools::GetEntry(aLabel).ToCString()); - aFirstChild = aFirstChild->Next(); - } - theValues.append(QString("%1 <== (%2)").arg(aGUIDPrefix).arg(aRefs.join(", "))); - } -} - -// ======================================================================= -// function : GetReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNode::GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)&) -{ - Handle(TDataStd_TreeNode) anAttribute = Handle(TDataStd_TreeNode)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - QModelIndexList aSelectedIndices = myTreeNodeView->selectionModel()->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - QModelIndex anIndex = aSelectedIndices[aSelectedId]; - - TreeModel_ItemBasePtr anAttributeItem = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowserPane_TDataStdTreeNodeItemPtr anAttributeNodeItem = - itemDynamicCast(anAttributeItem); - - Handle(TDF_Attribute) aNodeAttribute = anAttributeNodeItem->GetAttribute(); - if (aNodeAttribute.IsNull()) - continue; - - theRefLabels.Append(aNodeAttribute->Label()); - } -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.hxx deleted file mode 100644 index f008ada19f..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.hxx +++ /dev/null @@ -1,76 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TDataStdTreeNode_H -#define DFBrowserPane_TDataStdTreeNode_H - -#include - -#include - -class DFBrowserPane_TDataStdTreeNodeModel; -class QTreeView; - -//! \class DFBrowserPane_TDataStdTreeNode -//! \brief The class to manipulate of TDataStd_TreeNode attribute -class DFBrowserPane_TDataStdTreeNode : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TDataStdTreeNode(); - - //! Destructor - virtual ~DFBrowserPane_TDataStdTreeNode() {} - - //! Creates table view and call create widget of array table helper - //! \param theParent a parent widget - //! \return a new widget - Standard_EXPORT virtual QWidget* CreateWidget(QWidget* theParent) Standard_OVERRIDE; - - //! Initializes the content of the pane by the parameter attribute - //! \param theAttribute an OCAF attribute - Standard_EXPORT virtual void Init(const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns brief attribute information. In general case, it returns GetValues() result. - //! \param theAttribute a current attribute - //! \param theValues a result list of values - Standard_EXPORT virtual void GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE - { - (void)theAttribute; - (void)theValues; - } - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - Standard_OVERRIDE; - -private: - DFBrowserPane_TDataStdTreeNodeModel* myModel; - QTreeView* myTreeNodeView; -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx deleted file mode 100644 index 00efbb3492..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.cxx +++ /dev/null @@ -1,151 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNodeItem::Init() -{ - DFBrowserPane_TDataStdTreeNodeItemPtr aParentItem = - itemDynamicCast(Parent()); - // if aParentItem is empty, it is the root item, an attribute field is already filled by - // SetAttribute method - if (aParentItem) - myAttribute = aParentItem->getChildAttribute(Row()); - - Handle(TDataStd_TreeNode) aTreeNode = Handle(TDataStd_TreeNode)::DownCast(myAttribute); - if (aTreeNode.IsNull()) - return; - - TreeModel_ItemBase::Init(); - - myRowCount = aTreeNode->NbChildren(false); - myLabelName = QString(DFBrowserPane_Tools::GetEntry(aTreeNode->Label()).ToCString()); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNodeItem::Reset() -{ - DFBrowserPane_TDataStdTreeNodeItemPtr aParentItem = - itemDynamicCast(Parent()); - if (aParentItem) - { - Handle(TDF_Attribute) anAttribute; - SetAttribute(anAttribute); - myRowCount = 0; - myLabelName = QString(); - } - myIsCurrentItem = false; - TreeModel_ItemBase::Reset(); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant DFBrowserPane_TDataStdTreeNodeItem::initValue(const int theRole) const -{ - if (Column() != 0) - return QVariant(); - - switch (theRole) - { - case Qt::DisplayRole: - case Qt::ToolTipRole: - return getName(); - case Qt::ForegroundRole: - return myIsCurrentItem ? QColor(Qt::darkBlue) : QColor(Qt::black); - case Qt::BackgroundRole: - return myIsCurrentItem ? DFBrowserPane_Tools::LightHighlightColor() : QVariant(); - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr DFBrowserPane_TDataStdTreeNodeItem::createChild(int theRow, int theColumn) -{ - return DFBrowserPane_TDataStdTreeNodeItem::CreateItem(currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNodeItem::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : getChildAttribute -// purpose : -// ======================================================================= -Handle(TDF_Attribute) DFBrowserPane_TDataStdTreeNodeItem::getChildAttribute( - const int theChildRow) const -{ - Handle(TDF_Attribute) aResult; - - Handle(TDataStd_TreeNode) aTreeNode = Handle(TDataStd_TreeNode)::DownCast(myAttribute); - int aChildNodeId = 0; - for (TDataStd_ChildNodeIterator aChildIt(aTreeNode); aChildIt.More(); - aChildIt.Next(), aChildNodeId++) - { - if (aChildNodeId != theChildRow) - continue; - aResult = aChildIt.Value(); - break; - } - return aResult; -} - -// ======================================================================= -// function : getRowCount -// purpose : -// ======================================================================= -int DFBrowserPane_TDataStdTreeNodeItem::getRowCount() const -{ - initItem(); - return myRowCount; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx deleted file mode 100644 index c42efaaf32..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx +++ /dev/null @@ -1,133 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TDataStdTreeNodeItem_H -#define DFBrowserPane_TDataStdTreeNodeItem_H - -#include - -#include -#include - -#include -#include -#include -#include -#include - -class DFBrowserPane_TDataStdTreeNodeItem; -typedef QExplicitlySharedDataPointer - DFBrowserPane_TDataStdTreeNodeItemPtr; - -//! \class DFBrowserPane_TDataStdTreeNodeItem -//! An item connected to TDataStd_TreeNode attribute. Parent is NULL or tree node item. -//! Childrens are items for children of tree node attribute. -class DFBrowserPane_TDataStdTreeNodeItem : public TreeModel_ItemBase -{ - -public: - //! Creates an item wrapped by a shared pointer - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - //! \return the pointer to the created item - static DFBrowserPane_TDataStdTreeNodeItemPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return DFBrowserPane_TDataStdTreeNodeItemPtr( - new DFBrowserPane_TDataStdTreeNodeItem(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~DFBrowserPane_TDataStdTreeNodeItem() Standard_OVERRIDE {} - - //! Store a current attribute - //! \param theAttribute an attribute - void SetAttribute(const Handle(TDF_Attribute)& theAttribute) { myAttribute = theAttribute; } - - //! Returns the current attribute - //! \return an attribute - Handle(TDF_Attribute) GetAttribute() const - { - initItem(); - return myAttribute; - } - - //! Set state if the attribute is current(corresponds to the selected attribute in tree) - //! \param theCurrent boolean state - void setCurrentAttribute(const bool theCurrent) - { - Reset(); - myIsCurrentItem = theCurrent; - } - - //! Returns child attribute of the current attribute - //! \param theChildRow an index of a child attribute - //! \returns an attribute - Standard_EXPORT Handle(TDF_Attribute) getChildAttribute(const int theChildRow) const; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets the cached item values. Throws down the initialized state of the item. - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - -protected: - //! Returns the data stored under the given role for the current item. - //! \param theRole an enumeration value of role for data obtaining - virtual QVariant initValue(const int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! \return number of children. - virtual int initRowCount() const Standard_OVERRIDE { return getRowCount(); } - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -protected: - //! Constructor - //! \param theParent a parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - DFBrowserPane_TDataStdTreeNodeItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn), - myIsCurrentItem(false) - { - } - - //! Initializes the current item. It creates a backup of the specific item information - virtual void initItem() const Standard_OVERRIDE; - - //! Returns number of children attributes, initializes item is necessary - int getRowCount() const; - - //! Returns entry of the label of the current attribute tree node - QString getName() const { return myLabelName; } - -private: - Handle(TDF_Attribute) myAttribute; //! current attribute in tree node hierarchy - bool myIsCurrentItem; //! state whether this attribute is active in DFBrowser selected attribute - //! in tree - - int myRowCount; //! cached value of rows count - QString - myLabelName; //! cached value of label name of the label of the current tree node attribute -}; - -#endif \ No newline at end of file diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx deleted file mode 100644 index 4d56615791..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx +++ /dev/null @@ -1,100 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include - -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_TDataStdTreeNodeModel::DFBrowserPane_TDataStdTreeNodeModel(QObject* theParent) - : TreeModel_ModelBase(theParent) -{ -} - -// ======================================================================= -// function : InitColumns -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNodeModel::InitColumns() -{ - setHeaderItem(0, TreeModel_HeaderSection("Name")); -} - -// ======================================================================= -// function : createRootItem -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr DFBrowserPane_TDataStdTreeNodeModel::createRootItem(const int theColumnId) -{ - return DFBrowserPane_TDataStdTreeNodeItem::CreateItem(TreeModel_ItemBasePtr(), 0, theColumnId); -} - -// ======================================================================= -// function : SetAttribute -// purpose : -// ======================================================================= -void DFBrowserPane_TDataStdTreeNodeModel::SetAttribute(const Handle(TDF_Attribute)& theAttribute) -{ - DFBrowserPane_TDataStdTreeNodeItemPtr aRootItem = - itemDynamicCast(RootItem(0)); - Reset(); - aRootItem->SetAttribute(theAttribute); - EmitLayoutChanged(); -} - -// ======================================================================= -// function : FindIndex -// purpose : -// ======================================================================= -QModelIndex DFBrowserPane_TDataStdTreeNodeModel::FindIndex( - const Handle(TDF_Attribute)& theAttribute, - const QModelIndex theParentIndex) -{ - QModelIndex aParentIndex = theParentIndex; - - if (!aParentIndex.isValid()) - aParentIndex = index(0, 0); - - DFBrowserPane_TDataStdTreeNodeItemPtr aParentItem = - itemDynamicCast( - TreeModel_ModelBase::GetItemByIndex(aParentIndex)); - - if (aParentItem->GetAttribute() == theAttribute) - return aParentIndex; - - for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++) - { - QModelIndex anIndex = index(aChildId, 0, aParentIndex); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - DFBrowserPane_TDataStdTreeNodeItemPtr anItem = - itemDynamicCast(anItemBase); - - if (anItem->GetAttribute() == theAttribute) - return anIndex; - - QModelIndex aSubIndex = FindIndex(theAttribute, anIndex); - if (aSubIndex.isValid()) - return aSubIndex; - } - return QModelIndex(); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx deleted file mode 100644 index 7be35f4777..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx +++ /dev/null @@ -1,75 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TDataStdTreeNodeMode_H -#define DFBrowserPane_TDataStdTreeNodeMode_H - -#include - -#include -#include - -#include -#include -#include -#include -#include - -//! \class DFBrowserPane_TDataStdTreeNodeModel -//! \brief It builds a tree of items for the given tree node attribute. -class DFBrowserPane_TDataStdTreeNodeModel : public TreeModel_ModelBase -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TDataStdTreeNodeModel(QObject* theParent); - - //! Destructor - virtual ~DFBrowserPane_TDataStdTreeNodeModel() Standard_OVERRIDE {} - - //! Creates model columns and root items. - Standard_EXPORT virtual void InitColumns() Standard_OVERRIDE; - - //! Initializes the tree model by the attribute - //! \param theAttribute a current attribute - Standard_EXPORT void SetAttribute(const Handle(TDF_Attribute)& theAttribute); - - //! Returns model index by the attribute. The method is recursive. - //! \param theAttribute an attribute that is searched - //! \param theParentIndex an index of the parent item - //! \return the model index - QModelIndex FindIndex(const Handle(TDF_Attribute)& theAttribute, - const QModelIndex theParentIndex); - - //! Returns count of columns in the model. - //! \param theParent an index of the parent item - //! \return integer value - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 1; - } - -protected: - //! Creates root item - //! \param theColumnId index of a column - Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) - Standard_OVERRIDE; - -private: - Handle(TDF_Attribute) myAttribute; //! the parent attribute -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx b/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx deleted file mode 100644 index 70ab329aec..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx +++ /dev/null @@ -1,520 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const int COLUMN_EXPORT_WIDTH = 20; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_TNamingNamedShape::DFBrowserPane_TNamingNamedShape() - : DFBrowserPane_AttributePane(), - myEvolutionTableView(0), - myHelperExport(0) -{ - getPaneModel()->SetColumnCount(5); - - myEvolutionPaneModel = new DFBrowserPane_AttributePaneModel(); - myEvolutionPaneModel->SetColumnCount(10); - QList anItalicColumns; - anItalicColumns << 1 << 5; - myEvolutionPaneModel->SetItalicColumns(anItalicColumns); - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(myEvolutionPaneModel); - mySelectionModels.push_back(aSelectionModel); -} - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -QWidget* DFBrowserPane_TNamingNamedShape::CreateWidget(QWidget* theParent) -{ - QWidget* aMainWidget = new QWidget(theParent); - aMainWidget->setVisible(false); - - myTableView = new DFBrowserPane_TableView(aMainWidget); - myTableView->GetTableView()->verticalHeader()->setVisible(false); - myTableView->SetModel(myPaneModel); - QTableView* aTableView = myTableView->GetTableView(); - aTableView->setSelectionBehavior(QAbstractItemView::SelectItems); - std::list::const_iterator aSelectionModelsIt = mySelectionModels.begin(); - aTableView->setSelectionModel(*aSelectionModelsIt); - aSelectionModelsIt++; - - aTableView->horizontalHeader()->setStretchLastSection(false); - aTableView->setColumnWidth(3, COLUMN_EXPORT_WIDTH); - aTableView->setColumnWidth(4, COLUMN_EXPORT_WIDTH); - DFBrowserPane_ItemDelegateButton* anItemDelegate = - new DFBrowserPane_ItemDelegateButton(aTableView, ":/icons/export_shape.png"); - QList aRows; - aRows << 0 << 1; - anItemDelegate->SetFreeRows(aRows); - QObject::connect(anItemDelegate, - SIGNAL(buttonPressed(const QModelIndex&)), - &myHelperExport, - SLOT(OnButtonPressed(const QModelIndex&))); - aTableView->setItemDelegateForColumn(3, anItemDelegate); - - DFBrowserPane_ItemDelegateButton* anItemDelegate2 = - new DFBrowserPane_ItemDelegateButton(aTableView, ":/icons/folder_export.png"); - anItemDelegate2->SetFreeRows(aRows); - aTableView->setItemDelegateForColumn(4, anItemDelegate2); - - myEvolutionTableView = new DFBrowserPane_TableView(aMainWidget); - myEvolutionTableView->SetModel(myEvolutionPaneModel); - aTableView = myEvolutionTableView->GetTableView(); - - aTableView->setSelectionModel(*aSelectionModelsIt); - - aTableView->horizontalHeader()->setStretchLastSection(false); - aTableView->setColumnWidth(4, COLUMN_EXPORT_WIDTH); - aTableView->setColumnWidth(9, COLUMN_EXPORT_WIDTH); - - anItemDelegate = new DFBrowserPane_ItemDelegateButton(myEvolutionTableView->GetTableView(), - ":/icons/export_shape.png"); - QObject::connect(anItemDelegate, - SIGNAL(buttonPressed(const QModelIndex&)), - &myHelperExport, - SLOT(OnButtonPressed(const QModelIndex&))); - myEvolutionTableView->GetTableView()->setItemDelegateForColumn(4, anItemDelegate); - - anItemDelegate = new DFBrowserPane_ItemDelegateButton(myEvolutionTableView->GetTableView(), - ":/icons/export_shape.png"); - QObject::connect(anItemDelegate, - SIGNAL(buttonPressed(const QModelIndex&)), - &myHelperExport, - SLOT(OnButtonPressed(const QModelIndex&))); - myEvolutionTableView->GetTableView()->setItemDelegateForColumn(9, anItemDelegate); - - QGridLayout* aLay = new QGridLayout(aMainWidget); - aLay->setContentsMargins(0, 0, 0, 0); - aLay->addWidget(myTableView, 0, 0); - aLay->addWidget(myEvolutionTableView, 1, 0); - - return aMainWidget; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNamedShape::Init(const Handle(TDF_Attribute)& theAttribute) -{ - Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast(theAttribute); - myHelperExport.Clear(); - - QList aValues; - aValues << "Version" << QString::number(aShapeAttr->Version()) << "" << "" << ""; - aValues << "Evolution" - << DFBrowserPane_Tools::ToName(DB_NS_TYPE, aShapeAttr->Evolution()).ToCString() << "" - << "" << ""; - - NCollection_List aShapes; - QList aFreeRows; - aFreeRows << 0 << 1; - - TopoDS_Shape aShape = aShapeAttr->Get(); - TCollection_AsciiString aShapeInfo = - !aShape.IsNull() ? Standard_Dump::GetPointerInfo(aShape.TShape()) : ""; - aValues << "Shape" << aShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo(aShape) << "" - << ""; - aShapes.Append(aShape); - if (aShape.IsNull()) - aFreeRows << 2; - - TopoDS_Shape aCurrentShape = TNaming_Tool::CurrentShape(aShapeAttr); - TCollection_AsciiString aCurrentShapeInfo = - !aCurrentShape.IsNull() ? Standard_Dump::GetPointerInfo(aCurrentShape.TShape()) : ""; - aValues << "CurrentShape" << aCurrentShapeInfo.ToCString() - << DFBrowserPane_Tools::ShapeTypeInfo(aCurrentShape) << "" << ""; - aShapes.Append(aCurrentShape); - if (aCurrentShape.IsNull()) - aFreeRows << 3; - - TopoDS_Shape anOriginalShape = TNaming_Tool::OriginalShape(aShapeAttr); - TCollection_AsciiString anOriginalShapeInfo = - !anOriginalShape.IsNull() ? Standard_Dump::GetPointerInfo(anOriginalShape.TShape()) : ""; - aValues << "OriginalShape" << anOriginalShapeInfo.ToCString() - << DFBrowserPane_Tools::ShapeTypeInfo(anOriginalShape) << "" << ""; - aShapes.Append(anOriginalShape); - if (anOriginalShape.IsNull()) - aFreeRows << 4; - - DFBrowserPane_AttributePaneModel* aModel = getPaneModel(); - aModel->Init(aValues); - if (myTableView) - { - QTableView* aTableView = myTableView->GetTableView(); - for (int i = 0; i < aModel->columnCount(); i++) - { - if (i == 3 || i == 4) - dynamic_cast(aTableView->itemDelegateForColumn(3)) - ->SetFreeRows(aFreeRows); - else - aTableView->resizeColumnToContents(i); - } - } - QModelIndexList anIndices; - int aRowId = 2; - for (NCollection_List::Iterator aShapeIt(aShapes); aShapeIt.More(); - aShapeIt.Next(), aRowId++) - { - if (aShapeIt.Value().IsNull()) - continue; - anIndices.clear(); - anIndices << aModel->index(aRowId, 1) << aModel->index(aRowId, 2) << aModel->index(aRowId, 3) - << aModel->index(aRowId, 4); - myHelperExport.AddShape(aShapeIt.Value(), anIndices); - } - - // evolution table view filling - aValues.clear(); - aRowId = 0; - bool aHasModified = false; - for (TNaming_Iterator aShapeAttrIt(aShapeAttr); aShapeAttrIt.More(); - aShapeAttrIt.Next(), aRowId++) - { - const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape(); - const TopoDS_Shape& aNewShape = aShapeAttrIt.NewShape(); - - Handle(TNaming_NamedShape) anOldAttr = - TNaming_Tool::NamedShape(anOldShape, aShapeAttr->Label()); - aValues << DFBrowserPane_Tools::ToName(DB_NS_TYPE, aShapeAttrIt.Evolution()).ToCString(); - aHasModified = aHasModified | aShapeAttrIt.IsModification(); - - aValues << "New:"; - - QString aLabelInfo; - if (!anOldAttr.IsNull()) - { - TDF_Label anOldLabel = anOldAttr->Label(); - if (!anOldLabel.IsNull()) - aLabelInfo = QString(DFBrowserPane_Tools::GetEntry(anOldLabel).ToCString()); - } - if (!aNewShape.IsNull()) - aValues << Standard_Dump::GetPointerInfo(aNewShape.TShape()->This()).ToCString() - << DFBrowserPane_Tools::ShapeTypeInfo(aNewShape) << ""; - else - aValues << "-" << "-" << ""; - aValues << "Old:"; - if (!anOldShape.IsNull()) - aValues << Standard_Dump::GetPointerInfo(anOldShape.TShape()->This()).ToCString() - << DFBrowserPane_Tools::ShapeTypeInfo(anOldShape) << aLabelInfo << ""; - else - aValues << "-" << "-" << "-" << ""; - } - - if (myEvolutionTableView) - { - myEvolutionTableView->setVisible(aValues.size() > 0); - myEvolutionTableView->GetTableView()->setColumnHidden(1, !aHasModified); - myEvolutionPaneModel->Init(aValues); - - aRowId = 0; - for (TNaming_Iterator aShapeAttrIt(aShapeAttr); aShapeAttrIt.More(); - aShapeAttrIt.Next(), aRowId++) - { - const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape(); - const TopoDS_Shape& aNewShape = aShapeAttrIt.NewShape(); - - if (!aNewShape.IsNull()) - { - anIndices.clear(); - anIndices << myEvolutionPaneModel->index(aRowId, 2) - << myEvolutionPaneModel->index(aRowId, 3) - << myEvolutionPaneModel->index(aRowId, 4); - myHelperExport.AddShape(aNewShape, anIndices); - } - if (!anOldShape.IsNull()) - { - anIndices.clear(); - anIndices << myEvolutionPaneModel->index(aRowId, 6) - << myEvolutionPaneModel->index(aRowId, 7) - << myEvolutionPaneModel->index(aRowId, 9); - myHelperExport.AddShape(anOldShape, anIndices); - } - } - for (int i = 0; i < myEvolutionPaneModel->columnCount(); i++) - { - if (i == 5 || i == 10) - continue; - myEvolutionTableView->GetTableView()->resizeColumnToContents(i); - } - } -} - -// ======================================================================= -// function : GetValues -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNamedShape::GetValues(const Handle(TDF_Attribute)&, QList&) {} - -// ======================================================================= -// function : GetAttributeInfo -// purpose : -// ======================================================================= -QVariant DFBrowserPane_TNamingNamedShape::GetAttributeInfo( - const Handle(TDF_Attribute)& theAttribute, - int theRole, - int theColumnId) -{ - if (theColumnId != 0) - return DFBrowserPane_AttributePane::GetAttributeInfo(theAttribute, theRole, theColumnId); - - switch (theRole) - { - case Qt::DecorationRole: - return QIcon(":/icons/named_shape.png"); - case DFBrowserPane_ItemRole_Decoration_40x40: - return QIcon(":/icons/named_shape_40x40.png"); - case Qt::ForegroundRole: { - TopoDS_Shape aShape; - Handle(TNaming_NamedShape) anAttribute = Handle(TNaming_NamedShape)::DownCast(theAttribute); - if (!anAttribute.IsNull()) - aShape = anAttribute->Get(); - if (aShape.IsNull()) - return QColor(Qt::black); - - return QColor(aShape.Orientation() == TopAbs_FORWARD ? Qt::darkGray - : aShape.Orientation() == TopAbs_REVERSED ? QColor(Qt::gray) - : Qt::black); - } - default: - break; - } - return DFBrowserPane_AttributePane::GetAttributeInfo(theAttribute, theRole, theColumnId); -} - -// ======================================================================= -// function : GetShortAttributeInfo -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNamedShape::GetShortAttributeInfo( - const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TNaming_NamedShape) aShapeAttribute = Handle(TNaming_NamedShape)::DownCast(theAttribute); - - if (aShapeAttribute->Get().IsNull()) - theValues.append("EMPTY SHAPE"); - else - { - theValues.append( - QString("%1 : %2") - .arg(DFBrowserPane_Tools::ToName(DB_SHAPE_TYPE, aShapeAttribute->Get().ShapeType()) - .ToCString()) - .arg(DFBrowserPane_Tools::ToName(DB_NS_TYPE, aShapeAttribute->Evolution()).ToCString())); - } -} - -// ======================================================================= -// function : GetSelectionKind -// purpose : -// ======================================================================= -int DFBrowserPane_TNamingNamedShape::GetSelectionKind(QItemSelectionModel* theModel) -{ - int aKind = DFBrowserPane_AttributePaneAPI::GetSelectionKind(theModel); - - QTableView* aTableView = myTableView->GetTableView(); - if (aTableView->selectionModel() != theModel) - return aKind; - - QModelIndexList aSelectedIndices = theModel->selectedIndexes(); - if (aSelectedIndices.size() != 1) - return aKind; - - QModelIndex aSelectedIndex = aSelectedIndices.first(); - int aRow = aSelectedIndex.row(); - if (aRow == 0 || aRow == 1) - return aKind; - - if (aSelectedIndex.column() == 4) - aKind = DFBrowserPane_SelectionKind_ExportToShapeViewer; - - return aKind; -} - -// ======================================================================= -// function : GetSelectionParameters -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNamedShape::GetSelectionParameters( - QItemSelectionModel* theModel, - NCollection_List& theParameters, - NCollection_List& theItemNames) -{ - QTableView* aTableView = myTableView->GetTableView(); - if (aTableView->selectionModel() != theModel) - return; - - QModelIndexList aSelectedIndices = theModel->selectedIndexes(); - if (aSelectedIndices.size() != 1) - return; - - QModelIndex aSelectedIndex = aSelectedIndices.first(); - if (aSelectedIndex.column() != 4) - return; - - const TopoDS_Shape& aShape = myHelperExport.Shape(aSelectedIndex); - if (aShape.IsNull()) - return; - theParameters.Append(aShape.TShape()); - theItemNames.Append(TInspectorAPI_PluginParameters::ParametersToString(aShape)); -} - -// ======================================================================= -// function : GetReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNamedShape::GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) -{ - if (!myEvolutionTableView) - return; - QStringList aSelectedEntries = - DFBrowserPane_TableView::GetSelectedColumnValues(myEvolutionTableView->GetTableView(), 9); - - Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast(theAttribute); - for (TNaming_Iterator aShapeAttrIt(aShapeAttr); aShapeAttrIt.More(); aShapeAttrIt.Next()) - { - const TopoDS_Shape& anOldShape = aShapeAttrIt.OldShape(); - - Handle(TNaming_NamedShape) anOldAttr = - TNaming_Tool::NamedShape(anOldShape, aShapeAttr->Label()); - QString aLabelInfo; - if (!anOldAttr.IsNull()) - { - TDF_Label anOldLabel = anOldAttr->Label(); - if (!anOldLabel.IsNull()) - { - if (aSelectedEntries.contains(DFBrowserPane_Tools::GetEntry(anOldLabel).ToCString())) - theRefLabels.Append(anOldLabel); - } - } - } - TopoDS_Shape aShape = getSelectedShapes(); - if (!aShape.IsNull()) - { - Handle(AIS_Shape) aPresentation = new AIS_Shape(aShape); - aPresentation->Attributes()->SetAutoTriangulation(Standard_False); - theRefPresentation = aPresentation; - } -} - -// ======================================================================= -// function : GetPresentation -// purpose : -// ======================================================================= -Handle(Standard_Transient) DFBrowserPane_TNamingNamedShape::GetPresentation( - const Handle(TDF_Attribute)& theAttribute) -{ - Handle(Standard_Transient) aPresentation; - Handle(TNaming_NamedShape) aShapeAttr = Handle(TNaming_NamedShape)::DownCast(theAttribute); - if (aShapeAttr.IsNull()) - return aPresentation; - - TopoDS_Shape aShape = aShapeAttr->Get(); - if (aShape.IsNull()) - return aPresentation; - - aPresentation = new AIS_Shape(aShape); - return aPresentation; -} - -// ======================================================================= -// function : getSelectedShapes -// purpose : -// ======================================================================= -TopoDS_Shape DFBrowserPane_TNamingNamedShape::getSelectedShapes() -{ - TopoDS_Shape aShape; - - if (!myTableView && !myEvolutionTableView) - return aShape; - - // table view selected shapes - QItemSelectionModel* aTableViewSelModel = myTableView->GetTableView()->selectionModel(); - QModelIndexList anIndices = aTableViewSelModel->selectedIndexes(); - - BRep_Builder aBuilder; - TopoDS_Compound aComp; - aBuilder.MakeCompound(aComp); - bool aHasShapes = false; - for (QModelIndexList::const_iterator anIt = anIndices.begin(), aLast = anIndices.end(); - anIt != aLast; - anIt++) - { - QModelIndex anIndex = *anIt; - if (!myHelperExport.HasShape(anIndex)) - continue; - aBuilder.Add(aComp, myHelperExport.Shape(anIndex)); - aHasShapes = true; - } - - // evolution table selected shapes - aTableViewSelModel = myEvolutionTableView->GetTableView()->selectionModel(); - anIndices.clear(); - anIndices = aTableViewSelModel->selectedIndexes(); - for (QModelIndexList::const_iterator anIt = anIndices.begin(), aLast = anIndices.end(); - anIt != aLast; - anIt++) - { - QModelIndex anIndex = *anIt; - if (!myHelperExport.HasShape(anIndex)) - continue; - aBuilder.Add(aComp, myHelperExport.Shape(anIndex)); - aHasShapes = true; - } - if (aHasShapes) - aShape = aComp; - return aShape; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.hxx b/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.hxx deleted file mode 100644 index 2023152e51..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.hxx +++ /dev/null @@ -1,116 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TNamingNamedShape_H -#define DFBrowserPane_TNamingNamedShape_H - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -class DFBrowserPane_TableView; -class DFBrowserPane_AttributePaneModel; - -//! \class DFBrowserPane_TNamingNamedShape -//! \brief The class to manipulate of TNaming_NamedShape attribute -class DFBrowserPane_TNamingNamedShape : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TNamingNamedShape(); - - //! Destructor - Standard_EXPORT virtual ~DFBrowserPane_TNamingNamedShape() {} - - //! Creates table view and call create widget of array table helper - //! \param theParent a parent widget - //! \return a new widget - Standard_EXPORT virtual QWidget* CreateWidget(QWidget* theParent) Standard_OVERRIDE; - - //! Initializes the content of the pane by the parameter attribute - //! \param theAttribute an OCAF attribute - Standard_EXPORT virtual void Init(const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns information for the given attribute - //! \param theAttribute a current attribute - //! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background - //! and so on) \param theColumnId a tree model column \return value, interpreted by tree model - //! depending on the role - Standard_EXPORT virtual QVariant GetAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - int theRole, - int theColumnId) Standard_OVERRIDE; - - //! Returns brief attribute information. In general case, it returns GetValues() result. - //! \param theAttribute a current attribute - //! \param theValues a result list of values - Standard_EXPORT virtual void GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns selection kind for the model, it may be General selection or Additional selection for - //! example \param theModel one of selection models provided by this pane \return selection kind - Standard_EXPORT virtual int GetSelectionKind(QItemSelectionModel* theModel) Standard_OVERRIDE; - - //! Returns selection parameters, that may be useful for communicate between tools - //! \param theModel one of selection models provided by this pane - //! \theParameters a container of parameters, might be extended depending on the pane state(e.g. - //! selection) \theItemNames names to be selected for each selection parameter - Standard_EXPORT virtual void GetSelectionParameters( - QItemSelectionModel* theModel, - NCollection_List& theParameters, - NCollection_List& theItemNames) Standard_OVERRIDE; - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - Standard_OVERRIDE; - - //! Returns presentation of the attribute to be visualized in the view - //! \param theAttribute a current attribute - //! \return handle of presentation if the attribute has, to be visualized - Standard_EXPORT virtual Handle(Standard_Transient) GetPresentation( - const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - Standard_EXPORT virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - -protected: - //! Returns a compound of selected shapes in both, values and evolution tables - //! \return shape or NULL - TopoDS_Shape getSelectedShapes(); - -private: - DFBrowserPane_TableView* myEvolutionTableView; //!< table view for evolution shapes - DFBrowserPane_AttributePaneModel* myEvolutionPaneModel; //!< view model for evolution shapes - - DFBrowserPane_HelperExport myHelperExport; //! - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_TNamingNaming::DFBrowserPane_TNamingNaming() - : DFBrowserPane_AttributePane(), - myNamingView(0) -{ - myNamingModel = new DFBrowserPane_AttributePaneModel(); - myNamingModel->SetColumnCount(2); -} - -// ======================================================================= -// function : CreateWidget -// purpose : -// ======================================================================= -QWidget* DFBrowserPane_TNamingNaming::CreateWidget(QWidget* theParent) -{ - QWidget* aMainWidget = new QWidget(theParent); - - myNamingView = new DFBrowserPane_TableView(aMainWidget); - myNamingView->GetTableView()->verticalHeader()->setVisible(false); - myNamingView->GetTableView()->horizontalHeader()->setVisible(false); - myNamingView->SetModel(myNamingModel); - - myTableView = new DFBrowserPane_TableView(aMainWidget); - myTableView->SetModel(getPaneModel()); - myTableView->GetTableView()->setSelectionModel(mySelectionModels.front()); - - QGridLayout* aLay = new QGridLayout(aMainWidget); - aLay->setContentsMargins(0, 0, 0, 0); - aLay->addWidget(myNamingView); - aLay->addWidget(myTableView); - aLay->setRowStretch(1, 1); - - return aMainWidget; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNaming::Init(const Handle(TDF_Attribute)& theAttribute) -{ - QList aValues; - GetValues(theAttribute, aValues); - - QList aNamingValues; - for (int anValueId = 0; anValueId < 14; anValueId++) - aNamingValues.append(aValues[anValueId]); - myNamingModel->Init(aNamingValues); - if (myNamingView) - myNamingView->GetTableView()->resizeColumnToContents(0); - - QList aNamedShapesValues; - for (int anValueId = 14, aCount = aValues.size(); anValueId < aCount; anValueId++) - aNamedShapesValues.append(aValues[anValueId]); - - getPaneModel()->Init(aNamedShapesValues); - if (myTableView) - myTableView->GetTableView()->resizeColumnToContents(0); -} - -// ======================================================================= -// function : GetValues -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNaming::GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TNaming_Naming) anAttribute = Handle(TNaming_Naming)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - TNaming_Name aNamingName = anAttribute->GetName(); - - // values from 0-13 - theValues.append("Type"); - theValues.append(DFBrowserPane_Tools::ToName(DB_NAMING_TYPE, aNamingName.Type()).ToCString()); - theValues.append("ShapeType"); - theValues.append(DFBrowserPane_Tools::ToName(DB_SHAPE_TYPE, aNamingName.ShapeType()).ToCString()); - Handle(TNaming_NamedShape) aStopShape = aNamingName.StopNamedShape(); - theValues.append("StopNamedShape"); - theValues.append( - !aStopShape.IsNull() ? DFBrowserPane_Tools::GetEntry(aStopShape->Label()).ToCString() : ""); - theValues.append("Index"); - theValues.append(QString::number(aNamingName.Index())); - TopoDS_Shape aShape = aNamingName.Shape(); - theValues.append("Shape(TShape)"); - theValues.append( - !aShape.IsNull() ? Standard_Dump::GetPointerInfo(aShape.TShape()->This()).ToCString() : ""); - TDF_Label aContextLabel = aNamingName.ContextLabel(); - theValues.append("ContextLabel"); - theValues.append( - !aContextLabel.IsNull() ? DFBrowserPane_Tools::GetEntry(aContextLabel).ToCString() : ""); - theValues.append("Orientation"); - theValues.append( - DFBrowserPane_Tools::ToName(DB_ORIENTATION_TYPE, aNamingName.Orientation()).ToCString()); - - // values from 14 till count of arguments - int anArgIndex = 1; - for (TNaming_ListIteratorOfListOfNamedShape anArgIt(aNamingName.Arguments()); anArgIt.More(); - anArgIt.Next(), anArgIndex++) - { - theValues << "Argument"; - theValues.append(DFBrowserPane_Tools::GetEntry(anArgIt.Value()->Label()).ToCString()); - } -} - -// ======================================================================= -// function : GetPresentation -// purpose : -// ======================================================================= -Handle(Standard_Transient) DFBrowserPane_TNamingNaming::GetPresentation( - const Handle(TDF_Attribute)& theAttribute) -{ - Handle(Standard_Transient) aPresentation; - Handle(TNaming_Naming) anAttribute = Handle(TNaming_Naming)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return aPresentation; - - DFBrowserPane_TableView* aTableView = getTableView(); - if (!aTableView) // the pane is not visualized yet - return aPresentation; - - QStringList aSelectedEntries = - DFBrowserPane_TableView::GetSelectedColumnValues(aTableView->GetTableView(), 1); - TNaming_Name aNamingName = anAttribute->GetName(); - - BRep_Builder aBuilder; - TopoDS_Compound aComp; - aBuilder.MakeCompound(aComp); - bool aHasShapes = false; - for (TNaming_ListIteratorOfListOfNamedShape aNamingIt(aNamingName.Arguments()); aNamingIt.More(); - aNamingIt.Next()) - { - Handle(TNaming_NamedShape) aShapeAttr = aNamingIt.Value(); - if (aShapeAttr.IsNull()) - continue; - TDF_Label aLabel = aShapeAttr->Label(); - if (!aSelectedEntries.contains(DFBrowserPane_Tools::GetEntry(aLabel).ToCString())) - continue; - aBuilder.Add(aComp, aShapeAttr->Get()); - aHasShapes = true; - } - TopoDS_Shape aShape = aComp; - if (!aShape.IsNull() && aHasShapes) - { - Handle(AIS_Shape) aPrs = new AIS_Shape(aShape); - aPrs->Attributes()->SetAutoTriangulation(Standard_False); - aPresentation = aPrs; - } - return aPresentation; -} - -// ======================================================================= -// function : GetReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingNaming::GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)&) -{ - Handle(TNaming_Naming) anAttribute = Handle(TNaming_Naming)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - QStringList aSelectedEntries = - DFBrowserPane_TableView::GetSelectedColumnValues(getTableView()->GetTableView(), 1); - for (TNaming_ListIteratorOfListOfNamedShape aNamingIt(anAttribute->GetName().Arguments()); - aNamingIt.More(); - aNamingIt.Next()) - { - Handle(TNaming_NamedShape) aShapeAttr = aNamingIt.Value(); - if (aShapeAttr.IsNull()) - continue; - TDF_Label aLabel = aShapeAttr->Label(); - if (aSelectedEntries.contains(DFBrowserPane_Tools::GetEntry(aLabel).ToCString())) - theRefLabels.Append(aLabel); - } -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.hxx b/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.hxx deleted file mode 100644 index a86ed5b45e..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingNaming.hxx +++ /dev/null @@ -1,74 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TNamingNaming_H -#define DFBrowserPane_TNamingNaming_H - -#include - -#include - -class DFBrowserPane_AttributePaneModel; -class DFBrowserPane_TableView; - -class QWidget; - -//! \class DFBrowserPane_TNamingNaming -//! \brief The class to manipulate of TNaming_Naming attribute -class DFBrowserPane_TNamingNaming : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TNamingNaming(); - - //! Destructor - virtual ~DFBrowserPane_TNamingNaming() {} - - //! Creates table view and call create widget of array table helper - //! \param theParent a parent widget - //! \return a new widget - Standard_EXPORT virtual QWidget* CreateWidget(QWidget* theParent) Standard_OVERRIDE; - - //! Initializes the content of the pane by the parameter attribute - //! \param theAttribute an OCAF attribute - Standard_EXPORT virtual void Init(const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - Standard_EXPORT virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns presentation of the attribute to be visualized in the view - //! \param theAttribute a current attribute - //! \return handle of presentation if the attribute has, to be visualized - Standard_EXPORT virtual Handle(Standard_Transient) GetPresentation( - const Handle(TDF_Attribute)& theAttribute) Standard_OVERRIDE; - - //! Returns container of Label references to the attribute - //! \param theAttribute a current attribute - //! \param theRefLabels a container of label references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetReferences(const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefLabels, - Handle(Standard_Transient)& theRefPresentation) - Standard_OVERRIDE; - -private: - DFBrowserPane_TableView* myNamingView; //!< naming table view - DFBrowserPane_AttributePaneModel* myNamingModel; //!< naming parameters model -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx b/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx deleted file mode 100644 index fa7ec8bc8d..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx +++ /dev/null @@ -1,159 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -const int COLUMN_TYPE_WIDTH = 70; -const int COLUMN_POINTER_WIDTH = 90; -const int COLUMN_REFERENCE_WIDTH = 90; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_TNamingUsedShapes::DFBrowserPane_TNamingUsedShapes() - : DFBrowserPane_AttributePane() -{ - getPaneModel()->SetColumnCount(4); - getPaneModel()->SetItalicColumns(QList()); - - QList aValues; - aValues << "ShapeType" << "TShape" << "Label" << "RefShape"; - getPaneModel()->SetHeaderValues(aValues, Qt::Horizontal); -} - -// ======================================================================= -// function : GetValues -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingUsedShapes::GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - std::list aReferences; - TNaming_DataMapOfShapePtrRefShape& aMap = anAttribute->Map(); - for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt(aMap); aRefIt.More(); - aRefIt.Next()) - { - TopoDS_Shape aShape = aRefIt.Key(); - TNaming_PtrRefShape aPtrRefShape = aRefIt.Value(); - - if (!aShape.IsNull()) - { - theValues.append(DFBrowserPane_Tools::ToName(DB_SHAPE_TYPE, aShape.ShapeType()).ToCString()); - theValues.append(Standard_Dump::GetPointerInfo(aShape.TShape()->This()).ToCString()); - } - else - theValues << "EMPTY SHAPE" << ""; - - if (aPtrRefShape && aPtrRefShape->FirstUse()) - { - theValues.append(DFBrowserPane_Tools::GetEntry(aPtrRefShape->Label()).ToCString()); - const TopoDS_Shape& aValueShape = aPtrRefShape->Shape(); - theValues.append(!aValueShape.IsNull() - ? Standard_Dump::GetPointerInfo(aValueShape.TShape()->This()).ToCString() - : ""); - } - else - theValues << "" << ""; - } -} - -// ======================================================================= -// function : GetShortAttributeInfo -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingUsedShapes::GetShortAttributeInfo( - const Handle(TDF_Attribute)& theAttribute, - QList& theValues) -{ - Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - theValues.append(QString("%1").arg(anAttribute->Map().Extent())); -} - -// ======================================================================= -// function : GetAttributeReferences -// purpose : -// ======================================================================= -void DFBrowserPane_TNamingUsedShapes::GetAttributeReferences( - const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefAttributes, - Handle(Standard_Transient)& /*theRefPresentation*/) -{ - Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast(theAttribute); - if (anAttribute.IsNull()) - return; - - QStringList aSelectedEntries = - DFBrowserPane_TableView::GetSelectedColumnValues(getTableView()->GetTableView(), 2); - if (aSelectedEntries.isEmpty()) - return; - - for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt(anAttribute->Map()); aRefIt.More(); - aRefIt.Next()) - { - TNaming_PtrRefShape aPtrRefShape = aRefIt.Value(); - if (!aPtrRefShape || !aPtrRefShape->FirstUse()) - continue; - - if (aSelectedEntries.contains(DFBrowserPane_Tools::GetEntry(aPtrRefShape->Label()).ToCString())) - theRefAttributes.Append(aPtrRefShape->NamedShape()); - } -} - -// ======================================================================= -// function : getTableColumnWidths -// purpose : -// ======================================================================= -QMap DFBrowserPane_TNamingUsedShapes::getTableColumnWidths() const -{ - QMap aValues; - aValues[0] = COLUMN_TYPE_WIDTH; // "ShapeType" - aValues[1] = COLUMN_POINTER_WIDTH; // "Key_TShape" - aValues[2] = COLUMN_REFERENCE_WIDTH; // "Label Entry" - return aValues; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx b/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx deleted file mode 100644 index af49be405d..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.hxx +++ /dev/null @@ -1,64 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TNamingUsedShapes_H -#define DFBrowserPane_TNamingUsedShapes_H - -#include - -#include -#include - -class QWidget; - -//! \class DFBrowserPane_TNamingUsedShapes -//! \brief The class to manipulate of TNaming_UsedShapes attribute -class DFBrowserPane_TNamingUsedShapes : public DFBrowserPane_AttributePane -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TNamingUsedShapes(); - - //! Destructor - virtual ~DFBrowserPane_TNamingUsedShapes() {} - - //! Returns values to fill the table view model - //! \param theAttribute a current attribute - //! \param theValues a container of values - Standard_EXPORT virtual void GetValues(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns brief attribute information. In general case, it returns GetValues() result. - //! \param theAttribute a current attribute - //! \param theValues a result list of values - Standard_EXPORT virtual void GetShortAttributeInfo(const Handle(TDF_Attribute)& theAttribute, - QList& theValues) Standard_OVERRIDE; - - //! Returns container of Attribute references to the attribute - //! \param theAttribute a current attribute - //! \param theRefAttributes a container of attribute references, to be selected in tree view - //! \param theRefPresentation handle of presentation for the references, to be visualized - Standard_EXPORT virtual void GetAttributeReferences( - const Handle(TDF_Attribute)& theAttribute, - NCollection_List& theRefAttributes, - Handle(Standard_Transient)& theRefPresentation) Standard_OVERRIDE; - -protected: - //! Defines widths of table columns - //! \return container of widths - Standard_EXPORT virtual QMap getTableColumnWidths() const Standard_OVERRIDE; -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_TableView.cxx b/tools/DFBrowserPane/DFBrowserPane_TableView.cxx deleted file mode 100644 index 570499a2f7..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TableView.cxx +++ /dev/null @@ -1,116 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -DFBrowserPane_TableView::DFBrowserPane_TableView(QWidget* theParent, - const QMap& theDefaultColumnWidths) - : QWidget(theParent) -{ - QHBoxLayout* aLay = new QHBoxLayout(this); - aLay->setContentsMargins(0, 0, 0, 0); - - myTableView = new QTableView(theParent); - myTableView->setShowGrid(false); - - QHeaderView* aVHeader = myTableView->verticalHeader(); - aVHeader->setVisible(false); - aVHeader->setDefaultSectionSize(aVHeader->minimumSectionSize()); - - myTableView->horizontalHeader()->setStretchLastSection(true); - myTableView->horizontalHeader()->setVisible(false); - aLay->addWidget(myTableView); - myDefaultColumnWidths = theDefaultColumnWidths; -} - -// ======================================================================= -// function : SetModel -// purpose : -// ======================================================================= -void DFBrowserPane_TableView::SetModel(QAbstractTableModel* theModel) -{ - myTableView->setModel(theModel); - - for (int aColumnId = 0, aCount = theModel->columnCount(); aColumnId < aCount; aColumnId++) - myTableView->setColumnWidth(aColumnId, - myDefaultColumnWidths.contains(aColumnId) - ? myDefaultColumnWidths[aColumnId] - : DFBrowserPane_Tools::DefaultPanelColumnWidth(aColumnId)); -} - -// ======================================================================= -// function : SetFixedRowCount -// purpose : -// ======================================================================= -void DFBrowserPane_TableView::SetFixedRowCount(const int theCount, - QTableView* theView, - const bool theScroll) -{ - int aHeight = theView->verticalHeader()->defaultSectionSize() * theCount - + TreeModel_Tools::HeaderSectionMargin(); - if (theScroll) - aHeight += theView->horizontalScrollBar()->sizeHint().height(); - - theView->setMaximumHeight(aHeight); -} - -// ======================================================================= -// function : SetVisibleHorizontalHeader -// purpose : -// ======================================================================= -void DFBrowserPane_TableView::SetVisibleHorizontalHeader(const bool& theVisible) -{ - myTableView->horizontalHeader()->setVisible(theVisible); -} - -// ======================================================================= -// function : GetSelectedColumnValues -// purpose : -// ======================================================================= -QStringList DFBrowserPane_TableView::GetSelectedColumnValues(QTableView* theTableView, - const int theColumnId) -{ - QAbstractItemModel* aModel = theTableView->model(); - QModelIndexList aSelectedIndices = theTableView->selectionModel()->selectedIndexes(); - - QStringList aSelectedEntries; - for (QModelIndexList::const_iterator aSelectedIt = aSelectedIndices.begin(); - aSelectedIt != aSelectedIndices.end(); - aSelectedIt++) - { - QModelIndex anIndex = *aSelectedIt; - if (theColumnId == anIndex.column()) - aSelectedEntries.append( - aModel->data(aModel->index(anIndex.row(), theColumnId, anIndex.parent()), Qt::DisplayRole) - .toString()); - } - return aSelectedEntries; -} diff --git a/tools/DFBrowserPane/DFBrowserPane_TableView.hxx b/tools/DFBrowserPane/DFBrowserPane_TableView.hxx deleted file mode 100644 index 7f80283f82..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_TableView.hxx +++ /dev/null @@ -1,76 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_TableView_H -#define DFBrowserPane_TableView_H - -#include - -#include -#include -#include -#include - -class QTableView; -class QAbstractTableModel; - -//! \class DFBrowserPane_TableView -//! \brief The widget that contains table view with some settings: -//! - table grid is hidden -//! - vertical header is hidden -//! - stretch last column by horizontal -//! - default width of columns. -class DFBrowserPane_TableView : public QWidget -{ -public: - //! Constructor - Standard_EXPORT DFBrowserPane_TableView( - QWidget* theParent, - const QMap& theDefaultColumnWidths = QMap()); - - //! Destructor - virtual ~DFBrowserPane_TableView() {} - - //! Sets model into table view. After, set column widths for view - Standard_EXPORT void SetModel(QAbstractTableModel* theModel); - - //! Returns the current table view - QTableView* GetTableView() const { return myTableView; } - - //! Set horizontal header shown or hidden - //! \param theVisible visibility flag - Standard_EXPORT void SetVisibleHorizontalHeader(const bool& theVisible); - - //! Updates table view height to contain the given number of rows only - //! \param theCount a row count - //! \param theView a table view, which size will be changed - //! \param theScroll flag whether add scroll height to size - Standard_EXPORT static void SetFixedRowCount(const int theCount, - QTableView* theView, - const bool theScroll = false); - - //! Returns names of selected items in the view - //! \param theView a table view - //! \param theColumnId a column index - //! \return container of strings - Standard_EXPORT static QStringList GetSelectedColumnValues(QTableView* theTable, - const int theColumnId); - -private: - QTableView* myTableView; //!< the current table view - QMap myDefaultColumnWidths; //!< container of default widths of columns -}; - -#endif diff --git a/tools/DFBrowserPane/DFBrowserPane_Tools.cxx b/tools/DFBrowserPane/DFBrowserPane_Tools.cxx deleted file mode 100644 index e7d714a60e..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_Tools.cxx +++ /dev/null @@ -1,166 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -const int TABLE_COLUMN_0_WIDTH = 200; -const int TABLE_COLUMN_OTHER_WIDTH = 120; - -// ======================================================================= -// function : DefaultPanelColumnWidth -// purpose : -// ======================================================================= -int DFBrowserPane_Tools::DefaultPanelColumnWidth(const int theColumnId) -{ - return theColumnId == 0 ? TABLE_COLUMN_0_WIDTH : TABLE_COLUMN_OTHER_WIDTH; -} - -// ======================================================================= -// function : GetEntry -// purpose : -// ======================================================================= -TCollection_AsciiString DFBrowserPane_Tools::GetEntry(const TDF_Label& theLabel) -{ - if (theLabel.IsNull()) - return "Null"; - - TCollection_AsciiString anAsciiEntry; - TDF_Tool::Entry(theLabel, anAsciiEntry); - return anAsciiEntry; -} - -// ======================================================================= -// function : ShapeTypeInfo -// purpose : -// ======================================================================= -QVariant DFBrowserPane_Tools::ShapeTypeInfo(const TopoDS_Shape& theShape) -{ - return theShape.IsNull() - ? QString("Empty") - : QString(DFBrowserPane_Tools::ToName(DB_SHAPE_TYPE, theShape.ShapeType()).ToCString()); -} - -// ======================================================================= -// function : LightHighlightColor -// purpose : -// ======================================================================= -QColor DFBrowserPane_Tools::LightHighlightColor() -{ - QWidget aWidget; - QPalette aPalette = aWidget.palette(); - return aPalette.highlight().color().lighter(); -} - -// ======================================================================= -// function : ToName -// purpose : -// ======================================================================= -TCollection_AsciiString DFBrowserPane_Tools::ToName(const DFBrowserPane_OcctEnumType& theType, - const Standard_Integer& theEnumId) -{ - Standard_SStream aSStream; - switch (theType) - { - case DB_CONSTRAINT_TYPE: { - TDataXtd::Print((TDataXtd_ConstraintEnum)theEnumId, aSStream); - break; - } - case DB_NAMING_TYPE: { - TNaming::Print((TNaming_NameType)theEnumId, aSStream); - break; - } - case DB_SHAPE_TYPE: { - TopAbs::Print((TopAbs_ShapeEnum)theEnumId, aSStream); - break; - } - case DB_NS_TYPE: { - TNaming::Print((TNaming_Evolution)theEnumId, aSStream); - break; - } - case DB_GEOM_TYPE: { - TDataXtd::Print((TDataXtd_GeometryEnum)theEnumId, aSStream); - break; - } - case DB_DIMENSION_TYPE: { - TDataStd::Print((TDataStd_RealEnum)theEnumId, aSStream); - break; - } - case DB_MATERIAL_TYPE: - return Graphic3d_MaterialAspect::MaterialName(theEnumId + 1); - case DB_DISPLAY_MODE: { - switch (theEnumId) - { - case AIS_WireFrame: - return "WireFrame"; - case AIS_Shaded: - return "Shaded"; - default: - return "UNKNOWN DISPLAY MODE"; - } - break; - } - case DB_ORIENTATION_TYPE: { - TopAbs::Print((TopAbs_Orientation)theEnumId, aSStream); - break; - } - case DB_CDM_CAN_CLOSE_STATUS: { - switch (theEnumId) - { - case CDM_CCS_OK: - return "OK"; - case CDM_CCS_NotOpen: - return "NotOpen"; - case CDM_CCS_UnstoredReferenced: - return "UnstoredReferenced"; - case CDM_CCS_ReferenceRejection: - return "ReferenceRejection"; - default: - return "UNKNOWN CDM_CanCloseStatus"; - } - break; - } - default: - return "UNKNOWN PARAMETER"; - } - return aSStream.str().c_str(); -} diff --git a/tools/DFBrowserPane/DFBrowserPane_Tools.hxx b/tools/DFBrowserPane/DFBrowserPane_Tools.hxx deleted file mode 100644 index 8055ec8fa4..0000000000 --- a/tools/DFBrowserPane/DFBrowserPane_Tools.hxx +++ /dev/null @@ -1,83 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowserPane_Tools_H -#define DFBrowserPane_Tools_H - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#define PROPERTY_TABLE_ROW_COUNT 200 - -//! \class DFBrowserPane_Tools -//! \brief The tool that gives auxiliary methods for TDocStd elements manipulation -class DFBrowserPane_Tools -{ -public: - //! Returns default value for table view model: width[0] = 200, width[others] = 120 - //! \param theColumnId a column index - //! \returns value - Standard_EXPORT static int DefaultPanelColumnWidth(const int theColumnId); - - //! Returns a string presentation of the label - //! \param theLabel a label object - //! \return the string value - Standard_EXPORT static TCollection_AsciiString GetEntry(const TDF_Label& theLabel); - - //! Returns string value corresponded to the shape type if it is not null. - //! \param theShape a checked shape - //! \return string value or empty string value - Standard_EXPORT static QVariant ShapeTypeInfo(const TopoDS_Shape& theShape); - - //! Returns "true" or "false" text for the given boolean state - //! \param theValue a boolean value - //! \return string value - Standard_EXPORT static QString BoolToStr(const bool theValue) - { - return theValue ? "true" : "false"; - } - - //! Converts a Qt string to OCCT extended string - //! \param theValue a converted string - //! \return the extended string value - Standard_EXPORT static QString ToString(const TCollection_ExtendedString& theValue) - { - return QString::fromUtf16((uint16_t*)theValue.ToExtString()); - } - - //! Returns light highlight color - //! \returns Qt color - static Standard_EXPORT QColor LightHighlightColor(); - - //! Converts enumeration value into string text - //! \param theType an enumeration kind - //! \param theEnumId an enumeration value - //! \return string presentation - Standard_EXPORT static TCollection_AsciiString ToName(const DFBrowserPane_OcctEnumType& theType, - const Standard_Integer& theEnumId); -}; - -#endif diff --git a/tools/DFBrowserPane/FILES b/tools/DFBrowserPane/FILES deleted file mode 100644 index e07ebdaec0..0000000000 --- a/tools/DFBrowserPane/FILES +++ /dev/null @@ -1,41 +0,0 @@ -DFBrowserPane_AttributePane.cxx -DFBrowserPane_AttributePane.hxx -DFBrowserPane_AttributePaneAPI.hxx -DFBrowserPane_AttributePaneCreator.cxx -DFBrowserPane_AttributePaneCreator.hxx -DFBrowserPane_AttributePaneCreatorAPI.hxx -DFBrowserPane_AttributePaneModel.cxx -DFBrowserPane_AttributePaneModel.hxx -DFBrowserPane_AttributePaneSelector.cxx -DFBrowserPane_AttributePaneSelector.hxx -DFBrowserPane_HelperArray.cxx -DFBrowserPane_HelperArray.hxx -DFBrowserPane_HelperExport.cxx -DFBrowserPane_HelperExport.hxx -DFBrowserPane_ItemDelegateButton.cxx -DFBrowserPane_ItemDelegateButton.hxx -DFBrowserPane_ItemRole.hxx -DFBrowserPane_OcctEnumType.hxx -DFBrowserPane_SelectionKind.hxx -DFBrowserPane_TableView.cxx -DFBrowserPane_TableView.hxx -DFBrowserPane_TDataStdReferenceArray.cxx -DFBrowserPane_TDataStdReferenceArray.hxx -DFBrowserPane_TDataStdReferenceList.cxx -DFBrowserPane_TDataStdReferenceList.hxx -DFBrowserPane_TDataStdTreeNode.cxx -DFBrowserPane_TDataStdTreeNode.hxx -DFBrowserPane_TDataStdTreeNodeItem.cxx -DFBrowserPane_TDataStdTreeNodeItem.hxx -DFBrowserPane_TDataStdTreeNodeModel.cxx -DFBrowserPane_TDataStdTreeNodeModel.hxx -DFBrowserPane_TDFReference.cxx -DFBrowserPane_TDFReference.hxx -DFBrowserPane_TNamingNamedShape.cxx -DFBrowserPane_TNamingNamedShape.hxx -DFBrowserPane_TNamingNaming.cxx -DFBrowserPane_TNamingNaming.hxx -DFBrowserPane_TNamingUsedShapes.cxx -DFBrowserPane_TNamingUsedShapes.hxx -DFBrowserPane_Tools.cxx -DFBrowserPane_Tools.hxx \ No newline at end of file diff --git a/tools/MessageModel/FILES b/tools/MessageModel/FILES deleted file mode 100644 index dd94755372..0000000000 --- a/tools/MessageModel/FILES +++ /dev/null @@ -1,14 +0,0 @@ -MessageModel.qrc -MessageModel_Actions.cxx -MessageModel_Actions.hxx -MessageModel_ActionType.hxx -MessageModel_ItemAlert.cxx -MessageModel_ItemAlert.hxx -MessageModel_ItemBase.cxx -MessageModel_ItemBase.hxx -MessageModel_ItemReport.cxx -MessageModel_ItemReport.hxx -MessageModel_ItemRoot.cxx -MessageModel_ItemRoot.hxx -MessageModel_TreeModel.cxx -MessageModel_TreeModel.hxx diff --git a/tools/MessageModel/MessageModel.qrc b/tools/MessageModel/MessageModel.qrc deleted file mode 100644 index 8b794a8599..0000000000 --- a/tools/MessageModel/MessageModel.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - icons/item_shape.png - icons/item_streamValues.png - - diff --git a/tools/MessageModel/MessageModel_ActionType.hxx b/tools/MessageModel/MessageModel_ActionType.hxx deleted file mode 100644 index b5d7fb3ac1..0000000000 --- a/tools/MessageModel/MessageModel_ActionType.hxx +++ /dev/null @@ -1,32 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_ActionType_H -#define MessageModel_ActionType_H - -//! Kind of action type for tree view context menu item -enum MessageModel_ActionType -{ - MessageModel_ActionType_Activate, //!< set Message_Report active - MessageModel_ActionType_Deactivate, //!< set Message_Report not active - MessageModel_ActionType_Clear, //!< clear Message_Report alerts - MessageModel_ActionType_ExportToShapeView, //!< export TopoDS_Shape of selected item into - //!< TKShapeView plugin - MessageModel_ActionType_TestMetric, //!< test alerts - MessageModel_ActionType_TestMessenger, //!< test message view on messenger printer to report - MessageModel_ActionType_TestReportTree //!< test message view on hierarchical report -}; - -#endif diff --git a/tools/MessageModel/MessageModel_Actions.cxx b/tools/MessageModel/MessageModel_Actions.cxx deleted file mode 100644 index 3008360cd3..0000000000 --- a/tools/MessageModel/MessageModel_Actions.cxx +++ /dev/null @@ -1,280 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -MessageModel_Actions::MessageModel_Actions(QWidget* theParent, - MessageModel_TreeModel* theTreeModel, - QItemSelectionModel* theModel) - : QObject(theParent), - myTreeModel(theTreeModel), - mySelectionModel(theModel) -{ - myActions.insert( - MessageModel_ActionType_Activate, - ViewControl_Tools::CreateAction(tr("Activate"), SLOT(OnActivateReport()), parent(), this)); - myActions.insert( - MessageModel_ActionType_Deactivate, - ViewControl_Tools::CreateAction(tr("Deactivate"), SLOT(OnDeactivateReport()), parent(), this)); - myActions.insert( - MessageModel_ActionType_Clear, - ViewControl_Tools::CreateAction(tr("Clear"), SLOT(OnClearReport()), parent(), this)); - myActions.insert(MessageModel_ActionType_ExportToShapeView, - ViewControl_Tools::CreateAction(tr("Export to ShapeView"), - SLOT(OnExportToShapeView()), - parent(), - this)); -} - -// ======================================================================= -// function : GetAction -// purpose : -// ======================================================================= -QAction* MessageModel_Actions::GetAction(const MessageModel_ActionType& theType) -{ - return myActions.contains(theType) ? myActions[theType] : 0; -} - -// ======================================================================= -// function : AddMenuActions -// purpose : -// ======================================================================= -void MessageModel_Actions::AddMenuActions(const QModelIndexList& theSelectedIndices, QMenu* theMenu) -{ - MessageModel_ItemRootPtr aRootItem; - MessageModel_ItemReportPtr aReportItem; - MessageModel_ItemAlertPtr anAlertItem; - for (QModelIndexList::const_iterator aSelIt = theSelectedIndices.begin(); - aSelIt != theSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - aRootItem = itemDynamicCast(anItemBase); - if (aRootItem) - break; - - aReportItem = itemDynamicCast(anItemBase); - if (aReportItem) - break; - - anAlertItem = itemDynamicCast(anItemBase); - if (anAlertItem) - break; - } - - if (aReportItem && !aReportItem->GetReport().IsNull()) - { - theMenu->addAction(myActions[MessageModel_ActionType_Deactivate]); - theMenu->addAction(myActions[MessageModel_ActionType_Activate]); - theMenu->addAction(myActions[MessageModel_ActionType_Clear]); - } - else if (anAlertItem) - { - theMenu->addAction(myActions[MessageModel_ActionType_ExportToShapeView]); - } - - theMenu->addSeparator(); -} - -// ======================================================================= -// function : getSelectedReport -// purpose : -// ======================================================================= -Handle(Message_Report) MessageModel_Actions::getSelectedReport(QModelIndex& theReportIndex) const -{ - MessageModel_ItemReportPtr aReportItem; - QModelIndexList aSelectedIndices = mySelectionModel->selectedIndexes(); - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - aReportItem = itemDynamicCast(anItemBase); - theReportIndex = anIndex; - if (aReportItem) - break; - } - if (!aReportItem) - return NULL; - - return aReportItem->GetReport(); -} - -// ======================================================================= -// function : OnActivateReport -// purpose : -// ======================================================================= -static Handle(Message_PrinterToReport) MyPrinterToReport; -static Message_SequenceOfPrinters MyDeactivatedPrinters; - -void MessageModel_Actions::OnActivateReport() -{ - if (MyPrinterToReport.IsNull()) - MyPrinterToReport = new Message_PrinterToReport(); - - if (MyPrinterToReport->Report()->IsActiveInMessenger()) - return; - - MyDeactivatedPrinters = Message::DefaultMessenger()->Printers(); - Message::DefaultMessenger()->ChangePrinters().Clear(); - - Message::DefaultMessenger()->AddPrinter(MyPrinterToReport); - Message::DefaultReport()->UpdateActiveInMessenger(); - - myTreeModel->UpdateTreeModel(); -} - -// ======================================================================= -// function : OnDeactivateReport -// purpose : -// ======================================================================= -void MessageModel_Actions::OnDeactivateReport() -{ - if (MyPrinterToReport.IsNull() || !MyPrinterToReport->Report()->IsActiveInMessenger()) - return; - - Message::DefaultMessenger()->RemovePrinter(MyPrinterToReport); - Message::DefaultMessenger()->ChangePrinters().Assign(MyDeactivatedPrinters); - - myTreeModel->UpdateTreeModel(); -} - -// ======================================================================= -// function : OnClearReport -// purpose : -// ======================================================================= -void MessageModel_Actions::OnClearReport() -{ - QModelIndex aReportIndex; - Handle(Message_Report) aReport = getSelectedReport(aReportIndex); - if (aReport.IsNull()) - return; - - aReport->Clear(); - myTreeModel->UpdateTreeModel(); -} - -// ======================================================================= -// function : OnExportToShapeView -// purpose : -// ======================================================================= -void MessageModel_Actions::OnExportToShapeView() -{ - TCollection_AsciiString aPluginName("TKShapeView"); - - NCollection_List aPluginParameters; - if (myParameters->FindParameters(aPluginName)) - aPluginParameters = myParameters->Parameters(aPluginName); - NCollection_List anItemNames; - if (myParameters->FindSelectedNames(aPluginName)) - anItemNames = myParameters->GetSelectedNames(aPluginName); - - QModelIndexList aSelectedIndices = mySelectionModel->selectedIndexes(); - QStringList anExportedPointers; - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(anItemBase); - if (!anAlertItem) - continue; - - Handle(Message_Alert) anAlert = anAlertItem->GetAlert(); - if (anAlert.IsNull()) - continue; - - Handle(Message_AlertExtended) anExtAlert = Handle(Message_AlertExtended)::DownCast(anAlert); - if (anExtAlert.IsNull()) - continue; - - Handle(Message_Attribute) anAttribute = anExtAlert->Attribute(); - if (anAttribute.IsNull()) - continue; - - if (!anAttribute->IsKind(STANDARD_TYPE(TopoDS_AlertAttribute))) - continue; - - const TopoDS_Shape aShape = Handle(TopoDS_AlertAttribute)::DownCast(anAttribute)->GetShape(); - if (aShape.IsNull()) - continue; - aPluginParameters.Append(aShape.TShape()); - anItemNames.Append(TInspectorAPI_PluginParameters::ParametersToString(aShape)); - - anExportedPointers.append(Standard_Dump::GetPointerInfo(aShape.TShape(), true).ToCString()); - } - - if (anExportedPointers.empty()) - return; - myParameters->SetSelectedNames(aPluginName, anItemNames); - myParameters->SetParameters(aPluginName, aPluginParameters); - QMessageBox::information(0, - "Information", - QString("TShapes '%1' are sent to %2 tool.") - .arg(anExportedPointers.join(", ")) - .arg(QString(aPluginName.ToCString()))); -} diff --git a/tools/MessageModel/MessageModel_Actions.hxx b/tools/MessageModel/MessageModel_Actions.hxx deleted file mode 100644 index 973436dbd0..0000000000 --- a/tools/MessageModel/MessageModel_Actions.hxx +++ /dev/null @@ -1,99 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_Actions_H -#define MessageModel_Actions_H - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -class Message_Report; -class MessageModel_TreeModel; - -class QAction; -class QItemSelectionModel; -class QMenu; -class QWidget; - -//! \class MessageModel_Actions -//! \brief This is a listener of popup context menu items and selection change in message model -class MessageModel_Actions : public QObject -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT MessageModel_Actions(QWidget* theParent, - MessageModel_TreeModel* theTreeModel, - QItemSelectionModel* theModel); - - //! Destructor - virtual ~MessageModel_Actions() Standard_OVERRIDE {} - - //! Returns action by the type - //! \param theType an action type - //! \return an action instance if it exists - Standard_EXPORT QAction* GetAction(const MessageModel_ActionType& theType); - - //! Fills popup menu with actions depending on the current selection - //! \param theSelectedIndices tree model selected indices - //! \param theMenu menu to be filled - Standard_EXPORT void AddMenuActions(const QModelIndexList& theSelectedIndices, QMenu* theMenu); - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - { - myParameters = theParameters; - } - -public slots: - //! Set selected report active - void OnActivateReport(); - - //! Set selected report not active - void OnDeactivateReport(); - - //! Clears container of alerts of selected report - void OnClearReport(); - - //! Exports the first selected shape into ShapeViewer plugin. - void OnExportToShapeView(); - -protected: - //! Returns report of selected tree view item if a report item is selected - //! \param theReportIndex tree model index of the found report - //! \return report instance or NULL - Handle(Message_Report) getSelectedReport(QModelIndex& theReportIndex) const; - -protected: - MessageModel_TreeModel* myTreeModel; //< tree model - QItemSelectionModel* mySelectionModel; //< selection model - Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container - QMap myActions; //!< container of all actions -}; - -#endif diff --git a/tools/MessageModel/MessageModel_ItemAlert.cxx b/tools/MessageModel/MessageModel_ItemAlert.cxx deleted file mode 100644 index ca48f098a3..0000000000 --- a/tools/MessageModel/MessageModel_ItemAlert.cxx +++ /dev/null @@ -1,338 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant MessageModel_ItemAlert::initValue(const int theRole) const -{ - QVariant aParentValue = MessageModel_ItemBase::initValue(theRole); - if (aParentValue.isValid()) - return aParentValue; - - MessageModel_ItemReportPtr aReportItem = MessageModel_ItemReport::FindReportItem(Parent()); - if (!aReportItem) - return QVariant(); - - Handle(Message_Report) aReport = aReportItem->GetReport(); - if (aReport.IsNull()) - return QVariant(); - - if (theRole == Qt::ForegroundRole) - { - if (!aReport->IsActiveInMessenger()) - return QColor(Qt::darkGray); - - return QVariant(); - } - - Handle(Message_Alert) anAlert = getAlert(); - Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(anAlert); - - // if the alert is composite, process the real alert - if (theRole == Qt::DecorationRole && Column() == 0) - { - if (anExtendedAlert.IsNull()) - return QVariant(); - - Handle(Message_Attribute) anAttribute = anExtendedAlert->Attribute(); - if (anAttribute.IsNull()) - return QVariant(); - - if (anAttribute->IsKind(STANDARD_TYPE(TopoDS_AlertAttribute))) - return QIcon(":/icons/item_shape.png"); - else if (!Handle(Message_AttributeStream)::DownCast(anAttribute).IsNull()) - return QIcon(":/icons/item_streamValues.png"); - else - return QVariant(); - } - - if (theRole != Qt::DisplayRole && theRole != Qt::ToolTipRole) - return QVariant(); - - if (anAlert.IsNull()) - return QVariant(); - - if (Column() == 0) - { - if (theRole == Qt::DisplayRole) - { - TCollection_AsciiString aMessageKey = anAlert->GetMessageKey(); - if (aMessageKey.IsEmpty() && !Properties().IsNull()) - aMessageKey = Properties()->Key(); - return aMessageKey.ToCString(); - } - else - return anAlert->DynamicType()->Name(); - } - - Message_MetricType aMetricType; - int aPosition; - if (MessageModel_TreeModel::IsMetricColumn(Column(), aMetricType, aPosition)) - { - if (anExtendedAlert.IsNull()) - return QVariant(); - - Handle(Message_AttributeMeter) anAttribute = - Handle(Message_AttributeMeter)::DownCast(anExtendedAlert->Attribute()); - if (anAttribute.IsNull() || !anAttribute->HasMetric(aMetricType)) - return QVariant(); - - if (!anAttribute->IsMetricValid(aMetricType)) - return QVariant("in process"); - - if (aMetricType == Message_MetricType_ProcessCPUUserTime - || aMetricType == Message_MetricType_ProcessCPUSystemTime - || aMetricType == Message_MetricType_WallClock) - { - Standard_Real aCumulativeMetric = - anAttribute->StopValue(aMetricType) - anAttribute->StartValue(aMetricType); - if (fabs(aCumulativeMetric) < Precision::Confusion()) - return QVariant(); - - if (aPosition == 0) - return aCumulativeMetric; - else if (aPosition == 1) - { - Standard_Real aReportCumulativeMetric = - MessageModel_ItemReport::CumulativeMetric(aReport, aMetricType); - if (fabs(aReportCumulativeMetric) > Precision::Confusion()) - return 100. * aCumulativeMetric / aReportCumulativeMetric; - else - return QVariant(); - } - } - else - { - if (aPosition == 0) - return anAttribute->StopValue(aMetricType); - else if (aPosition == 1) - { - Standard_Real aCumulativeMetric = - anAttribute->StopValue(aMetricType) - anAttribute->StartValue(aMetricType); - if (fabs(aCumulativeMetric) < Precision::Confusion()) - return QVariant(); - else - return aCumulativeMetric; - } - } - } - return QVariant(); -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int MessageModel_ItemAlert::initRowCount() const -{ - const Handle(Message_Alert)& anAlert = getAlert(); - if (anAlert.IsNull()) - return 0; - - Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(anAlert); - if (anExtendedAlert.IsNull()) - return 0; - - Handle(Message_CompositeAlerts) aCompositeAlert = anExtendedAlert->CompositeAlerts(); - if (aCompositeAlert.IsNull()) - return 0; - - MessageModel_ItemAlert* aCurrentItem = (MessageModel_ItemAlert*)this; - for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++) - { - const Message_ListOfAlert& anAlerts = aCompositeAlert->Alerts((Message_Gravity)aGravityId); - { - for (Message_ListOfAlert::Iterator anIt(anAlerts); anIt.More(); anIt.Next()) - { - Message_ListOfAlert aCurAlerts; - aCurAlerts.Append(anIt.Value()); - aCurrentItem->myChildAlerts.Bind(myChildAlerts.Size(), aCurAlerts); - } - } - } - return aCurrentItem->myChildAlerts.Size(); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void MessageModel_ItemAlert::initStream(Standard_OStream& theOStream) const -{ - Handle(Message_AlertExtended) anExtendedAlert = - Handle(Message_AlertExtended)::DownCast(getAlert()); - if (anExtendedAlert.IsNull() || anExtendedAlert->Attribute().IsNull()) - return; - - Handle(Message_Attribute) anAttribute = anExtendedAlert->Attribute(); - if (anAttribute.IsNull()) - return; - - if (Handle(Message_AttributeStream)::DownCast(anAttribute).IsNull()) - return; - - Handle(Message_AttributeStream) anAttributeStream = - Handle(Message_AttributeStream)::DownCast(anExtendedAlert->Attribute()); - theOStream << anAttributeStream->Stream().str(); -} - -// ======================================================================= -// function : SetStream -// purpose : -// ======================================================================= -bool MessageModel_ItemAlert::SetStream(const Standard_SStream& theSStream, - Standard_Integer& theStartPos, - Standard_Integer& theLastPos) const -{ - Handle(Message_AlertExtended) anExtendedAlert = - Handle(Message_AlertExtended)::DownCast(getAlert()); - if (anExtendedAlert.IsNull() || anExtendedAlert->Attribute().IsNull()) - return false; - - Handle(Message_Attribute) anAttribute = anExtendedAlert->Attribute(); - if (anAttribute.IsNull()) - return false; - - if (Handle(Message_AttributeStream)::DownCast(anAttribute).IsNull()) - return false; - - Handle(Message_AttributeStream) anAttributeStream = - Handle(Message_AttributeStream)::DownCast(anExtendedAlert->Attribute()); - TCollection_AsciiString aStreamValue = Standard_Dump::Text(anAttributeStream->Stream()); - - TCollection_AsciiString aNewValue = Standard_Dump::Text(theSStream); - - Standard_SStream aStream; - aStream << aStreamValue.SubString(1, theStartPos - 1); - aStream << aNewValue; - if (theLastPos + 1 <= aStreamValue.Length()) - aStream << aStreamValue.SubString(theLastPos + 1, aStreamValue.Length()); - - anAttributeStream->SetStream(aStream); - - return true; -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr MessageModel_ItemAlert::createChild(int theRow, int theColumn) -{ - return MessageModel_ItemAlert::CreateItem(currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void MessageModel_ItemAlert::Init() -{ - MessageModel_ItemReportPtr aReportItem = itemDynamicCast(Parent()); - MessageModel_ItemAlertPtr anAlertItem; - Handle(Message_Alert) anAlert; - if (aReportItem) - { - Message_ListOfAlert anAlerts; - if (aReportItem->GetChildAlerts(Row(), anAlerts)) - { - myAlert = anAlerts.First(); - } - } - else - { - anAlertItem = itemDynamicCast(Parent()); - if (anAlertItem) - { - Message_ListOfAlert anAlerts; - if (anAlertItem->GetChildAlerts(Row(), anAlerts)) - { - myAlert = anAlerts.First(); - } - } - } - - Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast(myAlert); - if (!anExtendedAlert.IsNull() && !anExtendedAlert->Attribute().IsNull()) - { - Handle(Message_Attribute) anAttribute = anExtendedAlert->Attribute(); - if (!anAttribute.IsNull()) - { - if (anAttribute->IsKind(STANDARD_TYPE(TopoDS_AlertAttribute))) - myPresentation = new Convert_TransientShape( - Handle(TopoDS_AlertAttribute)::DownCast(anAttribute)->GetShape()); - } - } - MessageModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void MessageModel_ItemAlert::Reset() -{ - MessageModel_ItemBase::Reset(); - myAlert = Handle(Message_Alert)(); - myChildAlerts.Clear(); - myPresentation = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void MessageModel_ItemAlert::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : getAlert -// purpose : -// ======================================================================= -const Handle(Message_Alert)& MessageModel_ItemAlert::getAlert() const -{ - initItem(); - return myAlert; -} diff --git a/tools/MessageModel/MessageModel_ItemAlert.hxx b/tools/MessageModel/MessageModel_ItemAlert.hxx deleted file mode 100644 index 77f3e1abaa..0000000000 --- a/tools/MessageModel/MessageModel_ItemAlert.hxx +++ /dev/null @@ -1,131 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_ItemAlert_H -#define MessageModel_ItemAlert_H - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -class QAbstractTableModel; -class MessageModel_ItemAlert; - -typedef QExplicitlySharedDataPointer MessageModel_ItemAlertPtr; - -//! \class MessageModel_ItemAlert -//! This item is connected to Message_Alert. -//! Parent is either MessageModel_ItemRoot or MessageModel_ItemAlert, children are -//! MessageModel_ItemAlert or no children -class MessageModel_ItemAlert : public MessageModel_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - //! \param theRow the item row positition in the parent item - //! \param theColumn the item column positition in the parent item - //! \return the pointer to the created item - static MessageModel_ItemAlertPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return MessageModel_ItemAlertPtr(new MessageModel_ItemAlert(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~MessageModel_ItemAlert() Standard_OVERRIDE {}; - - //! Returns the current shape - const Handle(Message_Alert)& GetAlert() const { return myAlert; } - - //! Returns alert of the report for the parameter row - Standard_Boolean GetChildAlerts(const int theRow, Message_ListOfAlert& theAlerts) const - { - return myChildAlerts.Find(theRow, theAlerts); - } - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Return data value for the role. - //! \param theRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theRole) const Standard_OVERRIDE; - - //! \return number of children. - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual bool SetStream(const Standard_SStream& theSStream, - Standard_Integer& theStartPos, - Standard_Integer& theLastPos) const Standard_OVERRIDE; - - //! Returns presentation of the attribute to be visualized in the view - //! \thePresentations[out] container of presentation handles to be visualized - virtual void Presentations(NCollection_List& thePresentations) - Standard_OVERRIDE - { - TreeModel_ItemBase::Presentations(thePresentations); - thePresentations.Append(myPresentation); - } - -protected: - //! Initialize the current item. - virtual void initItem() const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - - //! Returns current alert, initialized item if it has not been initialized yet - //! \return alert value - const Handle(Message_Alert)& getAlert() const; - -private: - //! Constructor - MessageModel_ItemAlert(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : MessageModel_ItemBase(theParent, theRow, theColumn) - { - } - -private: - Handle(Message_Alert) myAlert; //!< current alert item - NCollection_DataMap - myChildAlerts; //!< container of child alerts - Handle(Standard_Transient) myPresentation; //!< item presentation -}; - -#endif diff --git a/tools/MessageModel/MessageModel_ItemBase.cxx b/tools/MessageModel/MessageModel_ItemBase.cxx deleted file mode 100644 index 7e7c7b2f7f..0000000000 --- a/tools/MessageModel/MessageModel_ItemBase.cxx +++ /dev/null @@ -1,35 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -// ======================================================================= -// function : GetRootItem -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr MessageModel_ItemBase::GetRootItem() const -{ - TreeModel_ItemBasePtr anItem = Parent(); - while (anItem) - { - if (MessageModel_ItemRootPtr aThisRootItem = itemDynamicCast(anItem)) - { - return aThisRootItem; - } - anItem = anItem->Parent(); - } - return TreeModel_ItemBasePtr(); -} diff --git a/tools/MessageModel/MessageModel_ItemBase.hxx b/tools/MessageModel/MessageModel_ItemBase.hxx deleted file mode 100644 index 98ce50cf1d..0000000000 --- a/tools/MessageModel/MessageModel_ItemBase.hxx +++ /dev/null @@ -1,52 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_ItemBase_H -#define MessageModel_ItemBase_H - -#include -#include -#include - -class MessageModel_ItemBase; -typedef QExplicitlySharedDataPointer MessageModel_ItemBasePtr; - -//! \class MessageModel_ItemBase -// \brief Declaration of the tree model base item. -class MessageModel_ItemBase : public TreeModel_ItemBase -{ -public: - //! Resets cached values - virtual void Reset() Standard_OVERRIDE { TreeModel_ItemBase::Reset(); } - -protected: - //! Initialize the current item. It creates a backup of the specific item information - virtual void initItem() const Standard_OVERRIDE {}; - - //! Constructor - //! param theParent a parent item - //! \param theRow the item row positition in the parent item - //! \param theColumn the item column positition in the parent item - MessageModel_ItemBase(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn) - { - } - - //! Return root item - //! \return an item instance - TreeModel_ItemBasePtr GetRootItem() const; -}; - -#endif \ No newline at end of file diff --git a/tools/MessageModel/MessageModel_ItemReport.cxx b/tools/MessageModel/MessageModel_ItemReport.cxx deleted file mode 100644 index 470aedffb8..0000000000 --- a/tools/MessageModel/MessageModel_ItemReport.cxx +++ /dev/null @@ -1,243 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant MessageModel_ItemReport::initValue(const int theRole) const -{ - QVariant aParentValue = MessageModel_ItemBase::initValue(theRole); - if (aParentValue.isValid()) - return aParentValue; - - const Handle(Message_Report)& aReport = getReport(); - if (aReport.IsNull()) - return QVariant(); - - if (theRole == Qt::ForegroundRole) - { - if (!aReport->IsActiveInMessenger()) - return QColor(Qt::darkGray); - - return QVariant(); - } - if (theRole == Qt::ToolTipRole && !myDescription.IsEmpty() - && Column() == 0) // display the exported file name in tool tip - { - OSD_Path aPath(myDescription); - return QString("%1%2").arg(aPath.Name().ToCString()).arg(aPath.Extension().ToCString()); - } - - if (theRole != Qt::DisplayRole) - return QVariant(); - - if (Column() == 0) - return aReport->DynamicType()->Name(); - - Message_MetricType aMetricType; - int aPosition; - if (MessageModel_TreeModel::IsMetricColumn(Column(), aMetricType, aPosition) - && (aMetricType == Message_MetricType_ProcessCPUUserTime - || aMetricType == Message_MetricType_ProcessCPUSystemTime - || aMetricType == Message_MetricType_WallClock)) - { - if (aPosition == 0) - return CumulativeMetric(aReport, aMetricType); - else if (aPosition == 1) - return "100"; - } - return QVariant(); -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int MessageModel_ItemReport::initRowCount() const -{ - const Handle(Message_Report)& aReport = getReport(); - if (aReport.IsNull()) - return 0; - - MessageModel_ItemReport* aCurrentItem = (MessageModel_ItemReport*)this; - for (int aGravityId = Message_Trace; aGravityId <= Message_Fail; aGravityId++) - { - const Message_ListOfAlert& anAlerts = aReport->GetAlerts((Message_Gravity)aGravityId); - for (Message_ListOfAlert::Iterator anIt(anAlerts); anIt.More(); anIt.Next()) - { - Message_ListOfAlert aCurAlerts; - aCurAlerts.Append(anIt.Value()); - aCurrentItem->myChildAlerts.Bind(myChildAlerts.Size(), aCurAlerts); - } - } - return aCurrentItem->myChildAlerts.Size(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr MessageModel_ItemReport::createChild(int theRow, int theColumn) -{ - return MessageModel_ItemAlert::CreateItem(currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void MessageModel_ItemReport::Init() -{ - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(Parent()); - myReport = aRootItem ? aRootItem->GetReport(Row(), myDescription) : Handle(Message_Report)(); - - MessageModel_ItemBase::Init(); -} - -// ======================================================================= -// function : getReport -// purpose : -// ======================================================================= -const Handle(Message_Report)& MessageModel_ItemReport::getReport() const -{ - initItem(); - return myReport; -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void MessageModel_ItemReport::Reset() -{ - MessageModel_ItemBase::Reset(); - myReport = Handle(Message_Report)(); - myChildAlerts.Clear(); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void MessageModel_ItemReport::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : FindReportItem -// purpose : -// ======================================================================= -MessageModel_ItemReportPtr MessageModel_ItemReport::FindReportItem( - const TreeModel_ItemBasePtr& theItem) -{ - TreeModel_ItemBasePtr anItem = theItem; - while (anItem) - { - if (MessageModel_ItemReportPtr aReportItem = itemDynamicCast(anItem)) - return aReportItem; - - anItem = anItem->Parent(); - } - return MessageModel_ItemReportPtr(); -} - -// ======================================================================= -// function : FindReport -// purpose : -// ======================================================================= -Handle(Message_Report) MessageModel_ItemReport::FindReport(const MessageModel_ItemBasePtr& theItem) -{ - Handle(Message_Report) aReport; - - MessageModel_ItemBasePtr anItem = theItem; - while (anItem) - { - MessageModel_ItemReportPtr aReportItem = itemDynamicCast(anItem); - - if (aReportItem) - return aReportItem->GetReport(); - - anItem = itemDynamicCast(anItem->Parent()); - } - return NULL; -} - -// ======================================================================= -// function : CumulativeMetric -// purpose : -// ======================================================================= -Standard_Real MessageModel_ItemReport::CumulativeMetric(const Handle(Message_Report)& theReport, - const Message_MetricType theMetricType) -{ - if (!theReport->ActiveMetrics().Contains(theMetricType)) - return 0; - - Standard_Real aMetric = 0; - for (int iGravity = Message_Trace; iGravity <= Message_Fail; ++iGravity) - { - const Message_ListOfAlert& anAlerts = theReport->GetAlerts((Message_Gravity)iGravity); - Handle(Message_AttributeMeter) aFirstAttribute /*, aLastAttribute*/; - for (Message_ListOfAlert::Iterator anAlertsIterator(anAlerts); anAlertsIterator.More(); - anAlertsIterator.Next()) - { - Handle(Message_AlertExtended) anAlert = - Handle(Message_AlertExtended)::DownCast(anAlertsIterator.Value()); - if (anAlert.IsNull()) - continue; - Handle(Message_AttributeMeter) anAttribute = - Handle(Message_AttributeMeter)::DownCast(anAlert->Attribute()); - if (anAttribute.IsNull() || !anAttribute->HasMetric(theMetricType) - || !anAttribute->IsMetricValid(theMetricType)) - continue; - - // if (aFirstAttribute.IsNull()) - // aFirstAttribute = anAttribute; - // else - //{ - // aLastAttribute = anAttribute; - //} - aMetric += anAttribute->StopValue(theMetricType) - anAttribute->StartValue(theMetricType); - } - // if (aFirstAttribute.IsNull()) - // continue; - // if (aLastAttribute.IsNull()) - // aLastAttribute = aFirstAttribute; - - // aMetric += aLastAttribute->StopValue (theMetricType) - aFirstAttribute->StartValue - // (theMetricType); - } - return aMetric; -} diff --git a/tools/MessageModel/MessageModel_ItemReport.hxx b/tools/MessageModel/MessageModel_ItemReport.hxx deleted file mode 100644 index 6fe8c9afeb..0000000000 --- a/tools/MessageModel/MessageModel_ItemReport.hxx +++ /dev/null @@ -1,126 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_ItemReport_H -#define MessageModel_ItemReport_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -class MessageModel_ItemReport; -typedef QExplicitlySharedDataPointer MessageModel_ItemReportPtr; - -//! \class MessageModel_ItemReport -//! This item is connected to Message_Alert. -//! Parent is MessageModel_ItemRoot, children are MessageModel_ItemAlert or no children -class MessageModel_ItemReport : public MessageModel_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - //! \param theRow the item row positition in the parent item - //! \param theColumn the item column positition in the parent item - //! \return the pointer to the created item - static MessageModel_ItemReportPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return MessageModel_ItemReportPtr(new MessageModel_ItemReport(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~MessageModel_ItemReport() Standard_OVERRIDE {}; - - //! Returns the current shape - const Handle(Message_Report)& GetReport() const { return myReport; } - - //! Returns alert of the report for the parameter row - Standard_Boolean GetChildAlerts(const int theRow, Message_ListOfAlert& theAlerts) const - { - return myChildAlerts.Find(theRow, theAlerts); - } - - //! Returns the report description or NULL - const TCollection_AsciiString& GetDescription() const { return myDescription; } - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Return data value for the role. - //! \param theRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theRole) const Standard_OVERRIDE; - - //! \return number of children. - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns report of the tree model item. Iterates up by parents intil the report item is found. - //! \return an item or NULL - Standard_EXPORT static MessageModel_ItemReportPtr FindReportItem( - const TreeModel_ItemBasePtr& theItem); - - //! Returns report of the item - static Handle(Message_Report) FindReport(const MessageModel_ItemBasePtr& thetItem); - - //! Returns report cumulative metric as stop time of the last alert minus start time of the first - //! alert - Standard_EXPORT static Standard_Real CumulativeMetric(const Handle(Message_Report)& theReport, - const Message_MetricType theMetricType); - -protected: - //! Initialize the current item. - virtual void initItem() const Standard_OVERRIDE; - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - - //! Returns number of child shapes. Init item if it is not initialized - //! \return integer value - int getRowCount() const; - - //! Returns current shape, initialized item if it has not been initialized yet - //! \return shape value - const Handle(Message_Report)& getReport() const; - -private: - //! Constructor - MessageModel_ItemReport(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : MessageModel_ItemBase(theParent, theRow, theColumn) - { - } - -private: - NCollection_DataMap - myChildAlerts; //!< container of child alerts - - Handle(Message_Report) myReport; //!< current report - TCollection_AsciiString myDescription; //!< description -}; - -#endif diff --git a/tools/MessageModel/MessageModel_ItemRoot.cxx b/tools/MessageModel/MessageModel_ItemRoot.cxx deleted file mode 100644 index 77a85baa8b..0000000000 --- a/tools/MessageModel/MessageModel_ItemRoot.cxx +++ /dev/null @@ -1,96 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -// ======================================================================= -// function : SetReport -// purpose : -// ======================================================================= -void MessageModel_ItemRoot::SetReport(const int theRowId, - const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription) -{ - NCollection_List::Iterator aReportsIt(myReports); - for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++) - { - if (aRowId == theRowId) - break; - } - aReportsIt.ChangeValue().myReport = theReport; - aReportsIt.ChangeValue().myDescription = theReportDescription; -} - -// ======================================================================= -// function : GetReport -// purpose : -// ======================================================================= -const Handle(Message_Report)& MessageModel_ItemRoot::GetReport( - const int theRowId, - TCollection_AsciiString& theReportDescription) -{ - NCollection_List::Iterator aReportsIt(myReports); - for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++) - { - if (aRowId == theRowId) - break; - } - theReportDescription = aReportsIt.Value().myDescription; - return aReportsIt.Value().myReport; -} - -// ======================================================================= -// function : HasReport -// purpose : -// ======================================================================= -Standard_Boolean MessageModel_ItemRoot::HasReport(const Handle(Message_Report)& theReport) -{ - NCollection_List::Iterator aReportsIt(myReports); - for (int aRowId = 0; aReportsIt.More(); aReportsIt.Next(), aRowId++) - { - if (aReportsIt.Value().myReport == theReport) - return Standard_True; - } - return Standard_False; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant MessageModel_ItemRoot::initValue(const int theRole) const -{ - QVariant aParentValue = MessageModel_ItemBase::initValue(theRole); - if (aParentValue.isValid()) - return aParentValue; - - if (Column() != 0) - return QVariant(); - - if (theRole == Qt::DisplayRole) - return myName.IsEmpty() ? "Message_Reports" : myName.ToCString(); - - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr MessageModel_ItemRoot::createChild(int theRow, int theColumn) -{ - return MessageModel_ItemReport::CreateItem(currentItem(), theRow, theColumn); -} diff --git a/tools/MessageModel/MessageModel_ItemRoot.hxx b/tools/MessageModel/MessageModel_ItemRoot.hxx deleted file mode 100644 index 202d70a22f..0000000000 --- a/tools/MessageModel/MessageModel_ItemRoot.hxx +++ /dev/null @@ -1,129 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_ItemRoot_H -#define MessageModel_ItemRoot_H - -#include -#include -#include -#include -#include - -#include - -class MessageModel_ItemRoot; -typedef QExplicitlySharedDataPointer MessageModel_ItemRootPtr; - -//! \struct to extend report by description -struct MessageModel_ReportInformation -{ - //! Constructor - MessageModel_ReportInformation(Handle(Message_Report) theReport, - const TCollection_AsciiString& theDescription) - : myReport(theReport), - myDescription(theDescription) - { - } - - Handle(Message_Report) myReport; //! report - TCollection_AsciiString myDescription; //! report description -}; - -//! \class MessageModel_ItemRoot -//! Collects message reports that should be visualized in tree view. Reports are cached and if -//! reports are not needed, cache should be cleared using RemoveAllReports Parent is NULL, children -//! are MessageModel_ItemReport items. -class MessageModel_ItemRoot : public MessageModel_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static MessageModel_ItemRootPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return MessageModel_ItemRootPtr(new MessageModel_ItemRoot(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~MessageModel_ItemRoot() Standard_OVERRIDE {}; - - //! Appends new report - //! \param theReport a report instance - //! \param theReportDescription an additional report information - void AddReport(const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription) - { - myReports.Append(MessageModel_ReportInformation(theReport, theReportDescription)); - } - - //! Set report, se it into the given row index - //! \param theRowId a report child row - //! \param theReport a report instance - //! \param theReportDescription an additional report information - Standard_EXPORT void SetReport(const int theRowId, - const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription = ""); - - //! Returns true if report exists is in the list of the current reports - //! \param theReport a report instance - //! \return boolean value - Standard_EXPORT Standard_Boolean HasReport(const Handle(Message_Report)& theReport); - - //!< Returns processed reports - const NCollection_List& Reports() const { return myReports; } - - //! Clears internal container of added reports - void RemoveAllReports() { myReports.Clear(); } - - //! Returns report by the number - //! \param theRowId an index of the report in the internal container. - Standard_EXPORT const Handle(Message_Report)& GetReport( - const int theRowId, - TCollection_AsciiString& theReportDescription); - - //! Set the item name - //! \param theName text value - void SetName(const TCollection_AsciiString& theName) { myName = theName; } - -protected: - //! Return data value for the role. - //! \param theRole a value role - //! \return the value - virtual QVariant initValue(const int theRole) const Standard_OVERRIDE; - - //! \return number of children. - virtual int initRowCount() const Standard_OVERRIDE { return myReports.Size(); } - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! param theParent a parent item - MessageModel_ItemRoot(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : MessageModel_ItemBase(theParent, theRow, theColumn) - { - } - -private: - NCollection_List myReports; //!< reports sent by algorithms - TCollection_AsciiString myName; //!< DisplayRole data, if defined -}; - -#endif diff --git a/tools/MessageModel/MessageModel_TreeModel.cxx b/tools/MessageModel/MessageModel_TreeModel.cxx deleted file mode 100644 index 89861d1a71..0000000000 --- a/tools/MessageModel/MessageModel_TreeModel.cxx +++ /dev/null @@ -1,209 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include - -const int COLUMN_NAME_WIDTH = 230; -const int COLUMN_SIZE_WIDTH = 30; - -const int COLUMN_REAL_VALUE_WIDTH = 115; -const int COLUMN_PERCENT_VALUE_WIDTH = 50; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -MessageModel_TreeModel::MessageModel_TreeModel(QObject* theParent) - : TreeModel_ModelBase(theParent) -{ -} - -// ======================================================================= -// function : InitColumns -// purpose : -// ======================================================================= -void MessageModel_TreeModel::InitColumns() -{ - // 0 - Name, 1 - visibility, 2 - Row - setHeaderItem(TreeModel_ColumnType_Name, TreeModel_HeaderSection("Name", COLUMN_NAME_WIDTH)); - setHeaderItem( - TreeModel_ColumnType_Visibility, - TreeModel_HeaderSection("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); - setHeaderItem(TreeModel_ColumnType_Row, - TreeModel_HeaderSection("Row", COLUMN_SIZE_WIDTH, Standard_True /*hidden*/)); - - int aNextIndex = 3; - for (int aMetricId = (int)Message_MetricType_None + 1; - aMetricId <= (int)Message_MetricType_MemHeapUsage; - aMetricId++) - { - Message_MetricType aMetricType = (Message_MetricType)aMetricId; - OSD_MemInfo::Counter aMemInfo; - bool isMemInfo = Message::ToOSDMetric(aMetricType, aMemInfo); - - setHeaderItem( - aNextIndex++, - TreeModel_HeaderSection( - QString("%1 [%2]").arg(Message::MetricToString(aMetricType)).arg(isMemInfo ? "Mb" : "s"), - COLUMN_REAL_VALUE_WIDTH)); - setHeaderItem(aNextIndex++, - TreeModel_HeaderSection(isMemInfo ? "Delta" : "%", COLUMN_PERCENT_VALUE_WIDTH)); - } -} - -// ======================================================================= -// function : GetMetricColumns -// purpose : -// ======================================================================= -void MessageModel_TreeModel::GetMetricColumns(const Message_MetricType theMetricType, - QList& theMetricColumns) -{ - theMetricColumns.clear(); - int aNextIndex = 3; // after default parent columns, see InitColumns - for (int aMetricId = (int)Message_MetricType_None + 1; - aMetricId <= (int)Message_MetricType_MemHeapUsage; - aMetricId++) - { - if (theMetricType != (Message_MetricType)aMetricId) - { - aNextIndex += 2; - continue; - } - theMetricColumns.append(aNextIndex++); - theMetricColumns.append(aNextIndex++); - } -} - -// ======================================================================= -// function : IsMetricColumn -// purpose : -// ======================================================================= -bool MessageModel_TreeModel::IsMetricColumn(const int theColumnId, - Message_MetricType& theMetricType, - int& thePosition) -{ - int aNextIndex = 3; // after default parent columns, see InitColumns - for (int aMetricId = (int)Message_MetricType_None + 1; - aMetricId <= (int)Message_MetricType_MemHeapUsage; - aMetricId++) - { - if (theColumnId == aNextIndex || theColumnId == aNextIndex + 1) - { - theMetricType = (Message_MetricType)aMetricId; - thePosition = theColumnId - aNextIndex; - return true; - } - aNextIndex += 2; - } - return false; -} - -// ======================================================================= -// function : createRootItem -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr MessageModel_TreeModel::createRootItem(const int theColumnId) -{ - return MessageModel_ItemRoot::CreateItem(TreeModel_ItemBasePtr(), 0, theColumnId); -} - -// ======================================================================= -// function : HasReport -// purpose : -// ======================================================================= -Standard_Boolean MessageModel_TreeModel::HasReport(const Handle(Message_Report)& theReport) -{ - if (columnCount() == 0) - return Standard_False; - - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(RootItem(0)); - return aRootItem && aRootItem->HasReport(theReport); -} - -// ======================================================================= -// function : AddReport -// purpose : -// ======================================================================= -void MessageModel_TreeModel::AddReport(const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription) -{ - for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) - { - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(RootItem(aColId)); - if (!aRootItem) - continue; - aRootItem->AddReport(theReport, theReportDescription); - } - - Reset(); - EmitLayoutChanged(); -} - -// ======================================================================= -// function : SetReport -// purpose : -// ======================================================================= -void MessageModel_TreeModel::SetReport(const int theRowId, - const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription) -{ - for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) - { - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(RootItem(aColId)); - if (!aRootItem) - continue; - aRootItem->SetReport(theRowId, theReport, theReportDescription); - } - Reset(); - EmitLayoutChanged(); -} - -// ======================================================================= -// function : Reports -// purpose : -// ======================================================================= -const NCollection_List& MessageModel_TreeModel::Reports() const -{ - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(RootItem(0)); - return aRootItem->Reports(); -} - -// ======================================================================= -// function : UpdateTreeModel -// purpose : -// ======================================================================= -void MessageModel_TreeModel::SetRootItemName(const TCollection_AsciiString& theName) -{ - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(RootItem(0)); - if (aRootItem) - aRootItem->SetName(theName); -} - -// ======================================================================= -// function : UpdateTreeModel -// purpose : -// ======================================================================= -void MessageModel_TreeModel::UpdateTreeModel() -{ - Reset(); - EmitLayoutChanged(); -} diff --git a/tools/MessageModel/MessageModel_TreeModel.hxx b/tools/MessageModel/MessageModel_TreeModel.hxx deleted file mode 100644 index 0325c455c7..0000000000 --- a/tools/MessageModel/MessageModel_TreeModel.hxx +++ /dev/null @@ -1,97 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageModel_TreeModel_H -#define MessageModel_TreeModel_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -class MessageModel_TreeModel; - -//! \class MessageModel_TreeModel -//! View model to visualize MessageReport/s content -class MessageModel_TreeModel : public TreeModel_ModelBase -{ -public: - //! Constructor - Standard_EXPORT MessageModel_TreeModel(QObject* theParent); - - //! Destructor - virtual ~MessageModel_TreeModel() Standard_OVERRIDE {}; - - //! Creates model columns and root items. - Standard_EXPORT virtual void InitColumns() Standard_OVERRIDE; - - //!< Returns columns of the model for the metric - //!< \param theMetricType metric - //!< \param[out] theMetricColumns container of metric columns - static Standard_EXPORT void GetMetricColumns(const Message_MetricType theMetricType, - QList& theMetricColumns); - - //!< Returns metric type for the column - //!< \param[in] theColumnId index of the tree column - //!< \param[out] theMetricType metric type if found - //!< \param[out] thePosition index of the metric column, 0 - is metric, 1 - is delta - //!< \return true if the column has metric parameters - static Standard_EXPORT bool IsMetricColumn(const int theColumnId, - Message_MetricType& theMetricType, - int& thePosition); - - //! Returns true if parameter report was added into the model - //! \param theReport a report instance - //! \return boolean value - Standard_EXPORT Standard_Boolean HasReport(const Handle(Message_Report)& theReport); - - //! Add shape, append it to the model root item - //! \param theReport a report instance - //! \param theReportDescription an additional report information - Standard_EXPORT void AddReport(const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription = ""); - - //! Set report, se it into the given row index - //! \param theRowId a report child row - //! \param theReport a report instance - //! \param theReportDescription an additional report information - Standard_EXPORT void SetReport(const int theRowId, - const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription = ""); - - //!< Returns processed reports - Standard_EXPORT const NCollection_List& Reports() const; - - //! Sets the text value of the Root item, only "Name" column accepts the parameter value - //! \theName visualized text of root item - Standard_EXPORT void SetRootItemName(const TCollection_AsciiString& theName); - - //! Updates tree model - Standard_EXPORT void UpdateTreeModel(); - -protected: - //! Creates root item - //! \param theColumnId index of a column - virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) Standard_OVERRIDE; -}; - -#endif diff --git a/tools/MessageModel/icons/item_shape.png b/tools/MessageModel/icons/item_shape.png deleted file mode 100644 index a808bc55e505fa5e0dd00fc0df80eae5a9eac27c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)b8c02hlmzzCYT+BYadXK|ku3NE#KtD1J<#s-Q>%sQ+!Pd3G zm6gg}U6+q^T}lH05CSkipMA8s`T6fXR$sZ?FF zZT+PvV&u1!A~?>>v-R~)PXS_v;(7bR$;s&(%Szt4ddE4y!ot0tvrgx{lgo*c5QVvJ z#rFN6W?9K}zYhLHk^}}2(Q=`%=V+RIXc&osvCHWJi^b}aZ5!_uMU>-;2>Ji|UbI{) zRoBMHlTQ%)?|O{a1y@&h%M%moYi2T28X^KAfB#At_CD5V zw4mAaLq(CA>9qOn0z5nOU$X2_AQBCryTFnpoQop$DJ92(fZqjyd_lwm z#^^`J@a^23(THuaPgcyqV(DCY@~pSZg{#l zhFJ8zonn}G*nr2?K9tvFP1^Uws=fu+3m(U^PtcpV*TMhdX^YuetNWZc2Ai*TW#pIr z6mDnJbbwv6MS+2*tb?^-S*G0a!a3Oix3}dp%v+v$D*E%f*K$E#;oJQy;j9Uh_mVWFKf{g+P3I)AOy z*7$RGM@`;Y*CSmgE(%S2Hb?)kfsbh<$HQGZr={{$unc`-ETA4tmYw)LIL1oR_=r>mdKI;Vst0G)P;+W-In diff --git a/tools/MessageView/FILES b/tools/MessageView/FILES deleted file mode 100644 index 7d7b86b686..0000000000 --- a/tools/MessageView/FILES +++ /dev/null @@ -1,10 +0,0 @@ -MessageView_ActionsTest.cxx -MessageView_ActionsTest.hxx -MessageView_Communicator.cxx -MessageView_Communicator.hxx -MessageView_MetricStatisticModel.cxx -MessageView_MetricStatisticModel.hxx -MessageView_VisibilityState.cxx -MessageView_VisibilityState.hxx -MessageView_Window.cxx -MessageView_Window.hxx diff --git a/tools/MessageView/MessageView_ActionsTest.cxx b/tools/MessageView/MessageView_ActionsTest.cxx deleted file mode 100644 index 03eb46e65f..0000000000 --- a/tools/MessageView/MessageView_ActionsTest.cxx +++ /dev/null @@ -1,367 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -MessageView_ActionsTest::MessageView_ActionsTest(QWidget* theParent, - MessageModel_TreeModel* theTreeModel, - QItemSelectionModel* theModel) - : QObject(theParent), - myTreeModel(theTreeModel), - mySelectionModel(theModel) -{ - myActions.insert( - MessageModel_ActionType_TestMetric, - ViewControl_Tools::CreateAction("Test ", SLOT(OnTestMetric()), parent(), this)); - myActions.insert(MessageModel_ActionType_TestMessenger, - ViewControl_Tools::CreateAction("Test ", - SLOT(OnTestMessenger()), - parent(), - this)); - myActions.insert(MessageModel_ActionType_TestReportTree, - ViewControl_Tools::CreateAction("Test ", - SLOT(OnTestReportTree()), - parent(), - this)); -} - -// ======================================================================= -// function : AddMenuActions -// purpose : -// ======================================================================= -void MessageView_ActionsTest::AddMenuActions(const QModelIndexList& theSelectedIndices, - QMenu* theMenu) -{ - MessageModel_ItemReportPtr aReportItem; - for (QModelIndexList::const_iterator aSelIt = theSelectedIndices.begin(); - aSelIt != theSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - MessageModel_ItemRootPtr aRootItem = itemDynamicCast(anItemBase); - if (aRootItem) - continue; - - aReportItem = itemDynamicCast(anItemBase); - if (aReportItem) - break; - - MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(anItemBase); - if (anAlertItem) - continue; - } - - if (aReportItem && !aReportItem->GetReport().IsNull()) - { - theMenu->addAction(myActions[MessageModel_ActionType_TestMetric]); - theMenu->addAction(myActions[MessageModel_ActionType_TestMessenger]); - theMenu->addAction(myActions[MessageModel_ActionType_TestReportTree]); - - bool isReportEnabled = aReportItem->GetReport()->IsActiveInMessenger(); - myActions[MessageModel_ActionType_TestMetric]->setEnabled(isReportEnabled); - myActions[MessageModel_ActionType_TestMessenger]->setEnabled(isReportEnabled); - myActions[MessageModel_ActionType_TestReportTree]->setEnabled(isReportEnabled); - } - theMenu->addSeparator(); -} - -// ======================================================================= -// function : getSelectedReport -// purpose : -// ======================================================================= -Handle(Message_Report) MessageView_ActionsTest::getSelectedReport(QModelIndex& theReportIndex) const -{ - MessageModel_ItemReportPtr aReportItem; - QModelIndexList aSelectedIndices = mySelectionModel->selectedIndexes(); - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - aReportItem = itemDynamicCast(anItemBase); - theReportIndex = anIndex; - if (aReportItem) - break; - } - if (!aReportItem) - return NULL; - - return aReportItem->GetReport(); -} - -// ======================================================================= -// function : OnTestMetric -// purpose : -// ======================================================================= -void MessageView_ActionsTest::OnTestMetric() -{ - QModelIndex aReportIndex; - Handle(Message_Report) aReport = getSelectedReport(aReportIndex); - if (aReport.IsNull()) - return; - - OCCT_ADD_MESSAGE_LEVEL_SENTRY("MessageModel_Actions::OnTestMetric()"); - clock_t start_time = clock(); - - Standard_Integer aCounter = 1500; - Standard_Real aValue = 0., aValue2 = 0.1; - - for (int aTopIt = 0; aTopIt < 4; aTopIt++) - { - Message::SendInfo() << "Calculate"; - for (int j = 0; j < aCounter; j++) - { - for (int i = 0; i < aCounter; i++) - { - aValue = (aValue * 2. + 3.) * 0.5 - 0.3 * 0.5; - - Standard_Real aValue3 = aValue + aValue2 * 0.2; - (void)aValue3; - } - } - } - - myTreeModel->UpdateTreeModel(); - - clock_t end_time = clock(); - std::cout << "clock() = " << end_time - start_time << std::endl; -} - -// ======================================================================= -// function : createShapeOnLevel -// purpose : -// ======================================================================= -void createShapeOnLevel() -{ - OCCT_ADD_MESSAGE_LEVEL_SENTRY("createShapeOnLevel") - - Message_Messenger::StreamBuffer sout = Message::SendInfo(); - - BRepBuilderAPI_MakeEdge aBuilder(gp_Pnt(0., 0., 0.), gp_Pnt(20., 10., 20.)); - TopoDS_Shape aShape = aBuilder.Shape(); - - Message::DefaultMessenger() << aShape; -} - -// ======================================================================= -// function : createShape -// purpose : -// ======================================================================= -void createShape() -{ - Message_Messenger::StreamBuffer sout = Message::SendInfo(); - BRepBuilderAPI_MakeEdge aBuilder(gp_Pnt(0., 0., 0.), gp_Pnt(20., 10., 20.)); - TopoDS_Shape aShape = aBuilder.Shape(); - - Message::DefaultMessenger() << aShape; - createShapeOnLevel(); -} - -// ======================================================================= -// function : OnTestMessenger -// purpose : -// ======================================================================= -void MessageView_ActionsTest::OnTestMessenger() -{ - // string messages - OCCT_ADD_MESSAGE_LEVEL_SENTRY("MessageModel_Actions::OnTestMessenger()") - - Message::DefaultMessenger()->Send("Values"); - Message::DefaultMessenger()->Send("Values second"); - - Message_Messenger::StreamBuffer sout = Message::SendInfo(); - // gp_XYZ - { - gp_XYZ aCoords(1.3, 2.3, 3.4); - aCoords.DumpJson(sout); - sout.Flush(Standard_True); - } - // gp_Dir - { - gp_Dir aDir(0.3, 0.3, 0.4); - aDir.DumpJson(sout); - sout.Flush(Standard_True); - } - // gp_Ax1 - { - gp_Ax1 aCoords(gp_Pnt(1.3, 2.3, 3.4), gp_Dir(0.3, 0.3, 0.4)); - aCoords.DumpJson(sout); - sout.Flush(Standard_True); - } - // gp_Ax2 - { - gp_Ax2 aCoords(gp_Pnt(10.3, 20.3, 30.4), gp_Dir(0.3, 0.3, 0.4)); - aCoords.DumpJson(sout); - sout.Flush(Standard_True); - } - // gp_Ax3 - { - gp_Ax3 aPln(gp_Pnt(10., 20., 15.), gp_Dir(0., 0., 1.), gp_Dir(1., 0., 0.)); - aPln.DumpJson(sout); - sout.Flush(Standard_True); - } - // gp_Trsf - { - gp_Trsf aTrsf; - aTrsf.SetRotation(gp::OZ(), 0.3); - aTrsf.SetTranslationPart(gp_Vec(15., 15., 15.)); - aTrsf.SetScaleFactor(3.); - - aTrsf.DumpJson(sout); - sout.Flush(Standard_True); - } - // Bnd_Box - { - Bnd_Box aBox(gp_Pnt(20., 15., 10.), gp_Pnt(25., 20., 15.)); - aBox.DumpJson(sout); - sout.Flush(Standard_True); - } - // Bnd_OBB - { - Bnd_OBB anOBB(gp_Pnt(-10., -15., -10.), - gp_Dir(1., 0., 0.), - gp_Dir(0., 1., 0.), - gp_Dir(0., 0., 1.), - 5., - 10., - 5.); - anOBB.DumpJson(sout); - sout.Flush(Standard_True); - } - // Quantity_ColorRGBA - { - Quantity_ColorRGBA aColor(0.2f, 0.8f, 0.8f, 0.2f); - aColor.DumpJson(sout); - sout.Flush(Standard_True); - } - // Quantity_Color - { - Quantity_Color aColor(0.8, 0.8, 0.8, Quantity_TOC_RGB); - aColor.DumpJson(sout); - sout.Flush(Standard_True); - } - // shape messages - { - createShape(); - } - myTreeModel->UpdateTreeModel(); -} - -// ======================================================================= -// function : levelAlerts -// purpose : -// ======================================================================= -void levelAlerts(const int theCurrentLevel, const int theTopLevel) -{ - if (theTopLevel - theCurrentLevel <= 0) - return; - - OCCT_ADD_MESSAGE_LEVEL_SENTRY(TCollection_AsciiString("Level: ") + theCurrentLevel) - - Message_Messenger::StreamBuffer sout = Message::SendInfo(); - sout << "Alert(" << theCurrentLevel << "): " << 1 << ", " << 2 << std::endl; - sout << "Alert(" << theCurrentLevel << "): " << 3 << ", " << 4 << std::endl; - - levelAlerts(theCurrentLevel + 1, theTopLevel); - - sout << "Alert(" << theCurrentLevel << "): " << 4 << ", " << 5 << std::endl; -} - -// ======================================================================= -// function : levelAlert -// purpose : -// ======================================================================= -void levelAlert(const int theCurrentLevel, const int theTopLevel) -{ - if (theTopLevel - theCurrentLevel <= 0) - return; - - OCCT_ADD_MESSAGE_LEVEL_SENTRY("levelAlert") - - Message_Messenger::StreamBuffer sout = Message::SendInfo(); - sout << "Level: " << theCurrentLevel << "(Single, no alerts on the level)" << std::endl; - - levelAlerts(theCurrentLevel + 1, theTopLevel); -} - -// ======================================================================= -// function : OnTestReportTree -// purpose : -// ======================================================================= -void MessageView_ActionsTest::OnTestReportTree() -{ - OCCT_ADD_MESSAGE_LEVEL_SENTRY("MessageModel_Actions::OnTestReportTree()") - Message_Messenger::StreamBuffer sout = Message::SendInfo(); - - int aTopLevel = 3; - levelAlerts(1, aTopLevel); - - sout << "Alert: " << 4 << std::endl; - levelAlert(1, aTopLevel); - - myTreeModel->UpdateTreeModel(); -} diff --git a/tools/MessageView/MessageView_ActionsTest.hxx b/tools/MessageView/MessageView_ActionsTest.hxx deleted file mode 100644 index d07bf97c56..0000000000 --- a/tools/MessageView/MessageView_ActionsTest.hxx +++ /dev/null @@ -1,82 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageView_ActionsTest_H -#define MessageView_ActionsTest_H - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -class Message_Report; -class MessageModel_TreeModel; - -class QAction; -class QItemSelectionModel; -class QMenu; -class QWidget; - -//! \class MessageView_ActionsTest -//! Window that unites all MessageView controls. -class MessageView_ActionsTest : public QObject -{ - Q_OBJECT -public: - //! Constructor - MessageView_ActionsTest(QWidget* theParent, - MessageModel_TreeModel* theTreeModel, - QItemSelectionModel* theModel); - - //! Destructor - virtual ~MessageView_ActionsTest() {} - - //! Fills popup menu with actions depending on the current selection - //! \param theSelectedIndices tree model selected indices - //! \param theMenu menu to be filled - Standard_EXPORT void AddMenuActions(const QModelIndexList& theSelectedIndices, QMenu* theMenu); - -public slots: - //! Sending several alerts to check metric of message-alert-tool mechanizm - void OnTestMetric(); - - //! Sending several alerts to check property panel/presentations of messenger-alert-tool mechanizm - void OnTestMessenger(); - - //! Check tree of alerts - void OnTestReportTree(); - -protected: - //! Returns report of selected tree view item if a report item is selected - //! \param theReportIndex tree model index of the found report - //! \return report instance or NULL - Handle(Message_Report) getSelectedReport(QModelIndex& theReportIndex) const; - -protected: - MessageModel_TreeModel* myTreeModel; //< tree model - QItemSelectionModel* mySelectionModel; //< selection model - QMap myActions; //!< container of all actions -}; - -#endif diff --git a/tools/MessageView/MessageView_Communicator.cxx b/tools/MessageView/MessageView_Communicator.cxx deleted file mode 100644 index 0776f0cfd6..0000000000 --- a/tools/MessageView/MessageView_Communicator.cxx +++ /dev/null @@ -1,25 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -// ======================================================================= -// function : CreateCommunicator -// purpose : Creates a communicator by the library loading -// ======================================================================= -Standard_EXPORTEXTERNC TInspectorAPI_Communicator* CreateCommunicator() -{ - return new MessageView_Communicator(); -} diff --git a/tools/MessageView/MessageView_Communicator.hxx b/tools/MessageView/MessageView_Communicator.hxx deleted file mode 100644 index 840fd2e428..0000000000 --- a/tools/MessageView/MessageView_Communicator.hxx +++ /dev/null @@ -1,78 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageView_Communicator_H -#define MessageView_Communicator_H - -#include -#include - -//! \class MessageView_Communicator. -//! \brief This is a connector from TInspector application to MessageView window -class MessageView_Communicator : public TInspectorAPI_Communicator -{ -public: - //! Constructor - MessageView_Communicator() - : TInspectorAPI_Communicator(), - myWindow(new MessageView_Window(0)) - { - } - - //! Destructor - virtual ~MessageView_Communicator() Standard_OVERRIDE {} - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - virtual void SetParent(void* theParent) Standard_OVERRIDE { myWindow->SetParent(theParent); } - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - virtual void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - Standard_OVERRIDE - { - myWindow->SetParameters(theParameters); - } - - //! Provide container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE - { - myWindow->FillActionsMenu(theMenu); - } - - //! Returns plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->GetPreferences(theItem); - } - - //! Stores plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->SetPreferences(theItem); - } - - //! Calls update of the plugin's content - virtual void UpdateContent() Standard_OVERRIDE { myWindow->UpdateContent(); } - -private: - MessageView_Window* myWindow; //!< current window -}; - -#endif diff --git a/tools/MessageView/MessageView_MetricStatisticModel.cxx b/tools/MessageView/MessageView_MetricStatisticModel.cxx deleted file mode 100644 index dd7c59dca9..0000000000 --- a/tools/MessageView/MessageView_MetricStatisticModel.cxx +++ /dev/null @@ -1,162 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Svetlana SHUTINA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void MessageView_MetricStatisticModel::Init(const TreeModel_ItemBasePtr theItemBase) -{ - MessageModel_ItemReportPtr aReportItem = itemDynamicCast(theItemBase); - if (aReportItem) - { - Handle(Message_Report) aReport = aReportItem->GetReport(); - const Message_ListOfAlert& anAlerts = aReport->GetAlerts(Message_Info); - for (Message_ListOfAlert::Iterator anIt(anAlerts); anIt.More(); anIt.Next()) - { - appendAlert(anIt.Value()); - } - } - else - { - MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(theItemBase); - if (anAlertItem) - { - appendAlert(anAlertItem->GetAlert()); - } - } - std::map> aTmpMap; - std::list aTimes; - for (QMap>::Iterator anIterValue = myValues.begin(); - anIterValue != myValues.end(); - ++anIterValue) - { - std::map>::iterator anIter = - aTmpMap.find(anIterValue.value().second); - if (anIter != aTmpMap.end()) - { - aTmpMap.at(anIterValue.value().second).push_back(anIterValue.key()); - } - else - { - std::list list; - list.push_back(anIterValue.key()); - aTmpMap.insert(std::pair>(anIterValue.value().second, list)); - aTimes.push_back(anIterValue.value().second); - } - } - aTimes.sort(); - aTimes.reverse(); - - for (std::list::iterator anIter = aTimes.begin(); anIter != aTimes.end(); anIter++) - { - double aTime = *anIter; - std::list names = aTmpMap.at(aTime); - for (std::list::iterator name = names.begin(); name != names.end(); name++) - { - int nb = myValues.find(*name).value().first; - RowValues value = {*name, nb, aTime}; - setValueByIndex(-1, value); - } - } -} - -// ======================================================================= -// function : appendAlert -// purpose : -// ======================================================================= -void MessageView_MetricStatisticModel::appendAlert(const Handle(Message_Alert)& theAlert) -{ - Handle(Message_AlertExtended) anExtAlert = Handle(Message_AlertExtended)::DownCast(theAlert); - if (anExtAlert.IsNull()) - { - return; - } - Handle(Message_Attribute) anAttr = anExtAlert->Attribute(); - Handle(Message_AttributeMeter) anAttrMeter = Handle(Message_AttributeMeter)::DownCast(anAttr); - if (anAttrMeter.IsNull()) - { - return; - } - - int aCount = 1; - double aTime = 0; - if (myValues.contains(anAttr->GetName().ToCString())) - { - aCount = myValues.value(anAttr->GetName().ToCString()).first + 1; - aTime = myValues.value(anAttr->GetName().ToCString()).second - + anAttrMeter->StopValue(myMetricType) - anAttrMeter->StartValue(myMetricType); - } - else - { - aCount = 1; - aTime = anAttrMeter->StopValue(myMetricType) - anAttrMeter->StartValue(myMetricType); - } - myValues[anAttr->GetName().ToCString()] = qMakePair(aCount, aTime); - - if (!anExtAlert->CompositeAlerts().IsNull()) - { - const Message_ListOfAlert& anAlerts = anExtAlert->CompositeAlerts()->Alerts(Message_Info); - for (Message_ListOfAlert::Iterator anIt(anAlerts); anIt.More(); anIt.Next()) - { - appendAlert(anIt.Value()); - } - } -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant MessageView_MetricStatisticModel::data(const QModelIndex& theIndex, int theRole) const -{ - switch (theRole) - { - case Qt::DisplayRole: { - switch (theIndex.column()) - { - case 0: - return mySortValues[theIndex.row()].myName; - case 1: - return mySortValues[theIndex.row()].myCounter; - case 2: - return mySortValues[theIndex.row()].myTime; - } - break; - } - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : setValueByIndex -// purpose : -// ======================================================================= -void MessageView_MetricStatisticModel::setValueByIndex(const int theIndex, const RowValues theValue) -{ - mySortValues.insert(theIndex == -1 ? mySortValues.size() : theIndex, theValue); -} diff --git a/tools/MessageView/MessageView_MetricStatisticModel.hxx b/tools/MessageView/MessageView_MetricStatisticModel.hxx deleted file mode 100644 index 14992001d4..0000000000 --- a/tools/MessageView/MessageView_MetricStatisticModel.hxx +++ /dev/null @@ -1,105 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Svetlana SHUTINA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#pragma once - -#include - -#include -#include - -#include -#include -#include - -//! @class MessageView_MetricStatisticModel -//! Table model that sums for parameter alert the number of calls and -//! metric time spent on the alert and its children. -//! It visualizes a table with statistic information: -//! the 1st column is alert name, the 2nd column is a counter of the name appearance, -//! the 3rd column is the cumulative time. -//! Tables rows are sorted by descending time. -class MessageView_MetricStatisticModel : public QAbstractTableModel -{ -private: - // Struct to describe a row of the table - struct RowValues - { - QString myName; //!< string values - int myCounter; //!< count of the values - double myTime; //!< total time - }; - -public: - //! Constructor - MessageView_MetricStatisticModel(const Message_MetricType& theType, QObject* theParent = 0) - : QAbstractTableModel(theParent), - myMetricType(theType) - { - } - - //! Destructor - virtual ~MessageView_MetricStatisticModel() {} - - //! Fills map of the fields values - //! \param theItemBase a parent item. - Standard_EXPORT void Init(const TreeModel_ItemBasePtr theItemBase); - - //! Returns content of the model index for the given role, - //! it is obtained from internal container of values. - //! It returns value only for DisplayRole - //! \param theIndex a model index - //! \param theRole a view role - //! \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns number of rows - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE - { - (void)theParent; - return myValues.size(); - } - - //! Returns number of columns - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE - { - (void)theParent; - return 3; - } - -private: - //! Sorts values and fills map of the fields values depends on unique text identifier. It's - //! recursive. \param theAlert unique text identifier. The alert should have attribute of the - //! metric type - void appendAlert(const Handle(Message_Alert)& theAlert); - - //! Adds theValues in the map to position theIndex - //! If theIndex is -1, the element will be added in the end of the map - //! \param theIndex the serial number in the map - //! \param theValues the field values - void setValueByIndex(const int theIndex, const RowValues theValues); - -private: - Message_MetricType myMetricType; //!< current metric type - QMap> myValues; //!< map of fields values - QMap mySortValues; //!< sorted map of fields values -}; diff --git a/tools/MessageView/MessageView_VisibilityState.cxx b/tools/MessageView/MessageView_VisibilityState.cxx deleted file mode 100644 index cf2243bc5a..0000000000 --- a/tools/MessageView/MessageView_VisibilityState.cxx +++ /dev/null @@ -1,82 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include - -#include - -// ======================================================================= -// function : CanBeVisible -// purpose : -// ======================================================================= -bool MessageView_VisibilityState::CanBeVisible(const QModelIndex& theIndex) const -{ - MessageModel_ItemAlertPtr anAlertItem = getAlertItem(theIndex); - if (anAlertItem) - { - NCollection_List aPresentations; - anAlertItem->Presentations(aPresentations); - if (!aPresentations.IsEmpty()) - return true; - } - return false; -} - -// ======================================================================= -// function : SetVisible -// purpose : -// ======================================================================= -bool MessageView_VisibilityState::SetVisible(const QModelIndex&, const bool, const bool) -{ - return false; -} - -// ======================================================================= -// function : IsVisible -// purpose : -// ======================================================================= -bool MessageView_VisibilityState::IsVisible(const QModelIndex&) const -{ - return false; -} - -// ======================================================================= -// function : OnClicked -// purpose : -// ======================================================================= -void MessageView_VisibilityState::OnClicked(const QModelIndex& theIndex) -{ - processClicked(theIndex); - emit itemClicked(theIndex); -} - -// ======================================================================= -// function : getAlertItem -// purpose : -// ======================================================================= -MessageModel_ItemAlertPtr MessageView_VisibilityState::getAlertItem( - const QModelIndex& theIndex) const -{ - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(theIndex); - if (!anItemBase) - return MessageModel_ItemAlertPtr(); - - MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast(anItemBase); - return anAlertItem; -} diff --git a/tools/MessageView/MessageView_VisibilityState.hxx b/tools/MessageView/MessageView_VisibilityState.hxx deleted file mode 100644 index 978fccfef1..0000000000 --- a/tools/MessageView/MessageView_VisibilityState.hxx +++ /dev/null @@ -1,92 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageView_VisibilityState_H -#define MessageView_VisibilityState_H - -#include -#include -#include - -#include -#include -#include - -class TreeModel_ModelBase; - -//! \class MessageView_VisibilityState -//! \brief Class provides connection between model and visualization control -class MessageView_VisibilityState : public QObject, public TreeModel_VisibilityState -{ - Q_OBJECT -public: - //! Constructor - MessageView_VisibilityState(TreeModel_ModelBase* theModel) - : TreeModel_VisibilityState(theModel), - myPresentationType(View_PresentationType_Main) - { - } - - //! Destructor - ~MessageView_VisibilityState() {} - - //! Sets current displayer - //! \theDisplayer class that provides connection to visualized objects - void SetDisplayer(View_Displayer* theDisplayer) { myDisplayer = theDisplayer; } - - //! Sets presentation type for displayer - //! \param theType type value - void SetPresentationType(const View_PresentationType theType) { myPresentationType = theType; } - - //! Returns true if visibility of the item can be changed - //! \param theIndex tree model index - //! \return boolean value - Standard_EXPORT virtual bool CanBeVisible(const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Sets visibility state - //! \theIndex tree model index - //! \param theState visibility state - //! \param toEmitDataChanged boolean flag whether emit of the model should be done immediately - //! \return true if state is changed - Standard_EXPORT virtual bool SetVisible(const QModelIndex& theIndex, - const bool theState, - const bool toEmitDataChanged) Standard_OVERRIDE; - - //! Returns visibility state value - Standard_EXPORT virtual bool IsVisible(const QModelIndex& theIndex) const Standard_OVERRIDE; - -public slots: - //! Processes the mouse clicked on the index. - //! It changes the item visibility if model allows to change it. - //! \theIndex tree model index - void OnClicked(const QModelIndex& theIndex); - -signals: - //! Signal after OnClicked is performed - //! \theIndex tree model index - void itemClicked(const QModelIndex& theIndex); - -protected: - //! Gets the alert item - //! \theIndex tree model index - //! \return item or NULL - MessageModel_ItemAlertPtr getAlertItem(const QModelIndex& theIndex) const; - -private: - View_Displayer* myDisplayer; //! view displayer - View_PresentationType myPresentationType; //! presentation type -}; - -#endif diff --git a/tools/MessageView/MessageView_Window.cxx b/tools/MessageView/MessageView_Window.cxx deleted file mode 100644 index 8baf46e684..0000000000 --- a/tools/MessageView/MessageView_Window.cxx +++ /dev/null @@ -1,782 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int DEFAULT_SHAPE_VIEW_WIDTH = 400; -const int DEFAULT_SHAPE_VIEW_HEIGHT = 450; -const int DEFAULT_SHAPE_VIEW_POSITION_X = 60; -const int DEFAULT_SHAPE_VIEW_POSITION_Y = 60; - -const int MESSAGEVIEW_DEFAULT_TREE_VIEW_WIDTH = 950; -const int MESSAGEVIEW_DEFAULT_TREE_VIEW_HEIGHT = 500; - -const int MESSAGEVIEW_DEFAULT_VIEW_WIDTH = 200; -const int MESSAGEVIEW_DEFAULT_VIEW_HEIGHT = 300; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -MessageView_Window::MessageView_Window(QWidget* theParent) - : QObject(theParent) -{ - myMainWindow = new QMainWindow(theParent); - - myTreeView = new ViewControl_TreeView(myMainWindow); - ((ViewControl_TreeView*)myTreeView) - ->SetPredefinedSize( - QSize(MESSAGEVIEW_DEFAULT_TREE_VIEW_WIDTH, MESSAGEVIEW_DEFAULT_TREE_VIEW_HEIGHT)); - MessageModel_TreeModel* aModel = new MessageModel_TreeModel(myTreeView); - aModel->InitColumns(); - - connect(myTreeView->header(), - SIGNAL(sectionResized(int, int, int)), - this, - SLOT(onHeaderResized(int, int, int))); - - myTreeView->setModel(aModel); - MessageView_VisibilityState* aVisibilityState = new MessageView_VisibilityState(aModel); - aModel->SetVisibilityState(aVisibilityState); - connect(aVisibilityState, - SIGNAL(itemClicked(const QModelIndex&)), - this, - SLOT(onTreeViewVisibilityClicked(const QModelIndex&))); - - TreeModel_Tools::UseVisibilityColumn(myTreeView); - TreeModel_Tools::SetDefaultHeaderSections(myTreeView); - - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(aModel); - myTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection); - myTreeView->setSelectionModel(aSelectionModel); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&))); - - myTreeViewActions = new MessageModel_Actions(myMainWindow, aModel, aSelectionModel); - myTestViewActions = new MessageView_ActionsTest(myMainWindow, aModel, aSelectionModel); - - myTreeView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(myTreeView, - SIGNAL(customContextMenuRequested(const QPoint&)), - this, - SLOT(onTreeViewContextMenuRequested(const QPoint&))); - - connect(myTreeView->header(), - SIGNAL(sectionResized(int, int, int)), - this, - SLOT(onHeaderResized(int, int, int))); - - QModelIndex aParentIndex = myTreeView->model()->index(0, 0); - myTreeView->setExpanded(aParentIndex, true); - - myMainWindow->setCentralWidget(myTreeView); - - // property view - myPropertyView = new ViewControl_PropertyView(myMainWindow); - myPropertyPanelWidget = new QDockWidget(tr("PropertyPanel"), myMainWindow); - myPropertyPanelWidget->setObjectName(myPropertyPanelWidget->windowTitle()); - myPropertyPanelWidget->setTitleBarWidget(new QWidget(myMainWindow)); - myPropertyPanelWidget->setWidget(myPropertyView->GetControl()); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, myPropertyPanelWidget); - connect(myPropertyPanelWidget->toggleViewAction(), - SIGNAL(toggled(bool)), - this, - SLOT(onPropertyPanelShown(bool))); - connect(myPropertyView, - SIGNAL(propertyViewDataChanged()), - this, - SLOT(onPropertyViewDataChanged())); - - myCustomView = new QTableView(myMainWindow); - myCustomPanelWidget = new QDockWidget(tr("PropertyPanel (custom)"), myMainWindow); - myCustomPanelWidget->setObjectName(myCustomPanelWidget->windowTitle()); - myCustomPanelWidget->setTitleBarWidget(new QWidget(myMainWindow)); - myCustomPanelWidget->setWidget(myCustomView); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, myCustomPanelWidget); - - // view - myViewWindow = new View_Window(myMainWindow, NULL, false); - connect(myViewWindow, SIGNAL(eraseAllPerformed()), this, SLOT(onEraseAllPerformed())); - aVisibilityState->SetDisplayer(myViewWindow->Displayer()); - aVisibilityState->SetPresentationType(View_PresentationType_Main); - myViewWindow->ViewWidget()->SetPredefinedSize(MESSAGEVIEW_DEFAULT_VIEW_WIDTH, - MESSAGEVIEW_DEFAULT_VIEW_HEIGHT); - - myViewDockWidget = new QDockWidget(tr("View"), myMainWindow); - myViewDockWidget->setObjectName(myViewDockWidget->windowTitle()); - myViewDockWidget->setWidget(myViewWindow); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, myViewDockWidget); - - myMainWindow->tabifyDockWidget(myCustomPanelWidget, myViewDockWidget); - - myMainWindow->resize(DEFAULT_SHAPE_VIEW_WIDTH, DEFAULT_SHAPE_VIEW_HEIGHT); - myMainWindow->move(DEFAULT_SHAPE_VIEW_POSITION_X, DEFAULT_SHAPE_VIEW_POSITION_Y); - - updateVisibleColumns(); -} - -// ======================================================================= -// function : SetParent -// purpose : -// ======================================================================= -void MessageView_Window::SetParent(void* theParent) -{ - QWidget* aParent = (QWidget*)theParent; - if (aParent) - { - QLayout* aLayout = aParent->layout(); - if (aLayout) - aLayout->addWidget(GetMainWindow()); - } - else - { - GetMainWindow()->setParent(0); - GetMainWindow()->setVisible(true); - } -} - -// ======================================================================= -// function : FillActionsMenu -// purpose : -// ======================================================================= -void MessageView_Window::FillActionsMenu(void* theMenu) -{ - QMenu* aMenu = (QMenu*)theMenu; - QList aDockwidgets = myMainWindow->findChildren(); - for (QList::iterator it = aDockwidgets.begin(); it != aDockwidgets.end(); ++it) - { - QDockWidget* aDockWidget = *it; - if (aDockWidget->parentWidget() == myMainWindow) - aMenu->addAction(aDockWidget->toggleViewAction()); - } -} - -// ======================================================================= -// function : GetPreferences -// purpose : -// ======================================================================= -void MessageView_Window::GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) -{ - theItem.Clear(); - theItem.Bind("geometry", - TreeModel_Tools::ToString(myMainWindow->saveState()).toStdString().c_str()); - - QMap anItems; - TreeModel_Tools::SaveState(myTreeView, anItems); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - { - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - } - - anItems.clear(); - View_Window::SaveState(myViewWindow, anItems); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - { - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - } -} - -// ======================================================================= -// function : SetPreferences -// purpose : -// ======================================================================= -void MessageView_Window::SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) -{ - for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt(theItem); anItemIt.More(); - anItemIt.Next()) - { - if (anItemIt.Key().IsEqual("geometry")) - myMainWindow->restoreState(TreeModel_Tools::ToByteArray(anItemIt.Value().ToCString())); - else if (TreeModel_Tools::RestoreState(myTreeView, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - else if (myViewWindow - && View_Window::RestoreState(myViewWindow, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - } -} - -// ======================================================================= -// function : UpdateContent -// purpose : -// ======================================================================= -void MessageView_Window::UpdateContent() -{ - TCollection_AsciiString aName = "TKMessageView"; - if (myParameters->FindParameters(aName)) - { - NCollection_List aParameters = myParameters->Parameters(aName); - // Init will remove from parameters those, that are processed only one time (TShape) - Init(aParameters); - myParameters->SetParameters(aName, aParameters); - } - Handle(Message_Report) aDefaultReport = Message::DefaultReport(); - MessageModel_TreeModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aDefaultReport.IsNull() && !aViewModel->HasReport(aDefaultReport)) - { - addReport(aDefaultReport); - } - - updateTreeModel(); - updateVisibleColumns(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void MessageView_Window::Init(NCollection_List& theParameters) -{ - Handle(AIS_InteractiveContext) aContext; - NCollection_List aParameters; - - Handle(Graphic3d_Camera) aViewCamera; - - for (NCollection_List::Iterator aParamsIt(theParameters); - aParamsIt.More(); - aParamsIt.Next()) - { - Handle(Standard_Transient) anObject = aParamsIt.Value(); - Handle(Message_Report) aMessageReport = Handle(Message_Report)::DownCast(anObject); - if (!aMessageReport.IsNull()) - { - addReport(aMessageReport); - } - else if (!Handle(AIS_InteractiveContext)::DownCast(anObject).IsNull()) - { - aParameters.Append(anObject); - if (aContext.IsNull()) - aContext = Handle(AIS_InteractiveContext)::DownCast(anObject); - } - else if (!Handle(Graphic3d_Camera)::DownCast(anObject).IsNull()) - { - aViewCamera = Handle(Graphic3d_Camera)::DownCast(anObject); - } - } - MessageModel_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - if (!aTreeModel) - return; - - aTreeModel->EmitLayoutChanged(); - - if (!aContext.IsNull()) - { - myViewWindow->SetContext(View_ContextType_External, aContext); - } - theParameters = aParameters; -} - -// ======================================================================= -// function : updateTreeModel -// purpose : -// ======================================================================= -void MessageView_Window::updateTreeModel() -{ - MessageModel_TreeModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aViewModel) - return; - - aViewModel->UpdateTreeModel(); -} - -// ======================================================================= -// function : addReport -// purpose : -// ======================================================================= -void MessageView_Window::addReport(const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription) -{ - MessageModel_TreeModel* aModel = dynamic_cast(myTreeView->model()); - aModel->AddReport(theReport, theReportDescription); -} - -// ======================================================================= -// function : onTreeViewVisibilityClicked -// purpose : -// ======================================================================= -void MessageView_Window::onTreeViewVisibilityClicked(const QModelIndex& theIndex) -{ - MessageModel_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - TreeModel_VisibilityState* aVisibilityState = aTreeModel->GetVisibilityState(); - if (!aVisibilityState->IsVisible(theIndex)) - myPropertyView->ClearActiveTablesSelection(); -} - -// ======================================================================= -// function : onTreeViewSelectionChanged -// purpose : -// ======================================================================= -void MessageView_Window::onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&) -{ - if (!myPropertyPanelWidget->toggleViewAction()->isChecked()) - return; - - updatePropertyPanelBySelection(); - updatePreviewPresentation(); -} - -// ======================================================================= -// function : onTreeViewContextMenuRequested -// purpose : -// ======================================================================= -void MessageView_Window::onTreeViewContextMenuRequested(const QPoint& thePosition) -{ - QMenu* aMenu = new QMenu(GetMainWindow()); - - MessageModel_ItemRootPtr aRootItem; - MessageModel_ItemReportPtr aReportItem; - QModelIndexList aSelectedIndices = myTreeView->selectionModel()->selectedIndexes(); - - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - aRootItem = itemDynamicCast(anItemBase); - if (aRootItem) - break; - aReportItem = itemDynamicCast(anItemBase); - if (aReportItem) - break; - } - if (aRootItem) - { - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Create Default Report"), - SLOT(onCreateDefaultReport()), - myMainWindow, - this)); - } - else if (aReportItem) - { - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Export Report"), - SLOT(onExportReport()), - myMainWindow, - this)); - - QAction* anAction = ViewControl_Tools::CreateAction(tr("WallClock Metric statistic"), - SLOT(onMetricStatistic()), - myMainWindow, - this); - anAction->setCheckable(true); - aMenu->addAction(anAction); - } - aMenu->addSeparator(); - - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Preview children presentations"), - SLOT(onPreviewChildren()), - myMainWindow, - this)); - aMenu->addSeparator(); - - myTreeViewActions->AddMenuActions(aSelectedIndices, aMenu); - addActivateMetricActions(aMenu); - - aMenu->addSeparator(); - myTestViewActions->AddMenuActions(aSelectedIndices, aMenu); - - QPoint aPoint = myTreeView->mapToGlobal(thePosition); - aMenu->exec(aPoint); -} - -// ======================================================================= -// function : onPropertyPanelShown -// purpose : -// ======================================================================= -void MessageView_Window::onPropertyPanelShown(bool isToggled) -{ - if (!isToggled) - return; - - updatePropertyPanelBySelection(); -} - -// ======================================================================= -// function : onPropertyViewDataChanged -// purpose : -// ======================================================================= -void MessageView_Window::onPropertyViewDataChanged() -{ - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - return; - - updatePropertyPanelBySelection(); - updatePreviewPresentation(); -} - -// ======================================================================= -// function : onHeaderResized -// purpose : -// ======================================================================= -void MessageView_Window::onHeaderResized(int theSectionId, int, int) -{ - TreeModel_ModelBase* aViewModel = dynamic_cast(myTreeView->model()); - - TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem(theSectionId); - aSection->SetWidth(myTreeView->columnWidth(theSectionId)); -} - -// ======================================================================= -// function : onEraseAllPerformed -// purpose : -// ======================================================================= -void MessageView_Window::onEraseAllPerformed() -{ - MessageModel_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - - aTreeModel->Reset(); - aTreeModel->EmitLayoutChanged(); -} - -// ======================================================================= -// function : onExportReport -// purpose : -// ======================================================================= -void MessageView_Window::onExportReport() -{ - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - return; - MessageModel_ItemReportPtr aReportItem = itemDynamicCast(anItemBase); - if (!aReportItem) - return; - - QString aFilter(tr("Document file (*.json *)")); - QString aSelectedFilter; - QString aFileName = QFileDialog::getSaveFileName(0, - tr("Export report to file"), - QString(), - aFilter, - &aSelectedFilter); - - Handle(Message_Report) aReport = aReportItem->GetReport(); - Standard_SStream aStream; - aReport->DumpJson(aStream); - - QFile aLogFile(aFileName); - if (!aLogFile.open(QFile::WriteOnly | QFile::Text)) - { - return; - } - QTextStream anOut(&aLogFile); - anOut << Standard_Dump::FormatJson(aStream).ToCString(); - aLogFile.close(); -} - -// ======================================================================= -// function : onCreateDefaultReport -// purpose : -// ======================================================================= -void MessageView_Window::onCreateDefaultReport() -{ - if (!Message::DefaultReport().IsNull()) - { - return; - } - - addReport(Message::DefaultReport(Standard_True)); -} - -// ======================================================================= -// function : onPreviewChildren -// purpose : -// ======================================================================= -void MessageView_Window::onPreviewChildren() -{ - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - - QModelIndexList aSelectedIndices = myTreeView->selectionModel()->selectedIndexes(); - NCollection_List aPresentations; - TreeModel_ModelBase::SubItemsPresentations(aSelectedIndices, aPresentations); - - displayer()->UpdatePreview(View_DisplayActionType_DisplayId, aPresentations); -} - -// ======================================================================= -// function : onMetricStatistic -// purpose : -// ======================================================================= -void MessageView_Window::onMetricStatistic() -{ - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - { - return; - } - - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - { - return; - } - - MessageView_MetricStatisticModel* aUnitByNameModel = - new MessageView_MetricStatisticModel(Message_MetricType_WallClock, myCustomView); - aUnitByNameModel->Init(anItemBase); - myCustomView->setModel(aUnitByNameModel); -} - -// ======================================================================= -// function : addActivateMetricActions -// purpose : -// ======================================================================= -void MessageView_Window::addActivateMetricActions(QMenu* theMenu) -{ - Handle(Message_Report) aReport = Message::DefaultReport(); - if (aReport.IsNull()) - { - return; - } - - QMenu* aSubMenu = new QMenu("Activate metric"); - for (int aMetricId = (int)Message_MetricType_None + 1; - aMetricId <= (int)Message_MetricType_MemHeapUsage; - aMetricId++) - { - Message_MetricType aMetricType = (Message_MetricType)aMetricId; - QAction* anAction = ViewControl_Tools::CreateAction(Message::MetricToString(aMetricType), - SLOT(OnActivateMetric()), - parent(), - this); - anAction->setCheckable(true); - anAction->setChecked(aReport->ActiveMetrics().Contains(aMetricType)); - aSubMenu->addAction(anAction); - } - aSubMenu->addSeparator(); - aSubMenu->addAction(ViewControl_Tools::CreateAction("Deactivate all", - SLOT(OnDeactivateAllMetrics()), - parent(), - this)); - - theMenu->addMenu(aSubMenu); -} - -// ======================================================================= -// function : OnActivateMetric -// purpose : -// ======================================================================= -void MessageView_Window::OnActivateMetric() -{ - QAction* anAction = (QAction*)(sender()); - - Message_MetricType aMetricType; - if (!Message::MetricFromString(anAction->text().toStdString().c_str(), aMetricType)) - return; - - Handle(Message_Report) aReport = Message::DefaultReport(); - const NCollection_IndexedMap& anActiveMetrics = aReport->ActiveMetrics(); - aReport->SetActiveMetric(aMetricType, !anActiveMetrics.Contains(aMetricType)); - - updateVisibleColumns(); -} - -// ======================================================================= -// function : OnDeactivateAllMetrics -// purpose : -// ======================================================================= -void MessageView_Window::OnDeactivateAllMetrics() -{ - Handle(Message_Report) aReport = Message::DefaultReport(); - if (aReport.IsNull()) - return; - aReport->ClearMetrics(); - - updateVisibleColumns(); -} - -// ======================================================================= -// function : displayer -// purpose : -// ======================================================================= -View_Displayer* MessageView_Window::displayer() -{ - return myViewWindow->Displayer(); -} - -// ======================================================================= -// function : updatePropertyPanelBySelection -// purpose : -// ======================================================================= -void MessageView_Window::updatePropertyPanelBySelection() -{ - ViewControl_TableModelValues* aTableValues = 0; - - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (anItemBase) - { - Handle(TreeModel_ItemProperties) anItemProperties = anItemBase->Properties(); - if (!anItemProperties.IsNull()) - { - aTableValues = new ViewControl_TableModelValues(); - aTableValues->SetProperties(anItemProperties); - } - } - myPropertyView->Init(aTableValues); -} - -// ======================================================================= -// function : updatePreviewPresentation -// purpose : -// ======================================================================= -void MessageView_Window::updatePreviewPresentation() -{ - Handle(AIS_InteractiveContext) aContext = myViewWindow->ViewToolBar()->CurrentContext(); - if (aContext.IsNull()) - return; - - NCollection_List aPresentations; - QModelIndexList aSelectedIndices = myTreeView->selectionModel()->selectedIndexes(); - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - anItemBase->Presentations(aPresentations); - } - - displayer()->UpdatePreview(View_DisplayActionType_DisplayId, aPresentations); -} - -// ======================================================================= -// function : updateVisibleColumns -// purpose : -// ======================================================================= -void MessageView_Window::updateVisibleColumns() -{ - MessageModel_TreeModel* aViewModel = dynamic_cast(myTreeView->model()); - - NCollection_IndexedMap anActiveMetrics; - for (NCollection_List::Iterator anIterator(aViewModel->Reports()); - anIterator.More(); - anIterator.Next()) - { - Handle(Message_Report) aReport = anIterator.Value().myReport; - for (NCollection_IndexedMap::Iterator aMetricsIterator( - aReport->ActiveMetrics()); - aMetricsIterator.More(); - aMetricsIterator.Next()) - { - if (anActiveMetrics.Contains(aMetricsIterator.Value())) - continue; - anActiveMetrics.Add(aMetricsIterator.Value()); - } - } - - for (int aMetricId = (int)Message_MetricType_None + 1; - aMetricId <= (int)Message_MetricType_MemHeapUsage; - aMetricId++) - { - Message_MetricType aMetricType = (Message_MetricType)aMetricId; - QList aMetricColumns; - aViewModel->GetMetricColumns(aMetricType, aMetricColumns); - bool isColumnHidden = !anActiveMetrics.Contains(aMetricType); - for (int i = 0; i < aMetricColumns.size(); i++) - { - int aColumnId = aMetricColumns[i]; - myTreeView->setColumnHidden(aColumnId, isColumnHidden); - TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem(aColumnId); - aSection->SetIsHidden(isColumnHidden); - } - } -} diff --git a/tools/MessageView/MessageView_Window.hxx b/tools/MessageView/MessageView_Window.hxx deleted file mode 100644 index 0dd7f0a91a..0000000000 --- a/tools/MessageView/MessageView_Window.hxx +++ /dev/null @@ -1,202 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef MessageView_Window_H -#define MessageView_Window_H - -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class View_Displayer; -class View_Window; - -class ViewControl_PropertyView; - -class MessageView_ActionsTest; - -class QDockWidget; -class QMainWindow; -class QMenu; -class QWidget; - -//! \class MessageView_Window -//! Window that unites all MessageView controls. -class MessageView_Window : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT MessageView_Window(QWidget* theParent); - - //! Destructor - virtual ~MessageView_Window() {} - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - Standard_EXPORT void SetParent(void* theParent); - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - { - myParameters = theParameters; - myTreeViewActions->SetParameters(theParameters); - } - - //! Provide container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - Standard_EXPORT virtual void FillActionsMenu(void* theMenu); - - //! Returns plugin preferences: dock widgets state, tree view columns. - //! \param theItem container of preference elements - Standard_EXPORT void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies plugin preferences - //! \param theItem container of preference elements - Standard_EXPORT void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies parameters to Init controls, opens files if there are in parameters, updates OCAF tree - //! view model - Standard_EXPORT void UpdateContent(); - - //! Returns main control - QMainWindow* GetMainWindow() const { return myMainWindow; } - - //! Returns current tree view - QTreeView* GetTreeView() const { return myTreeView; } - -protected: - //! Appends shape into tree view model - //! \param theShape a shape instance - //! \param theReportDescription an additional report information - void addReport(const Handle(Message_Report)& theReport, - const TCollection_AsciiString& theReportDescription = ""); - -private: - //! Fills controls of the plugin by parameters: - //! - Fine AIS_InteractiveObject and fills View if it if it differs from the current context - //! \param theParameters a parameters container - void Init(NCollection_List& theParameters); - - //! Updates tree model - void updateTreeModel(); - -protected slots: - //! Updates property view selection in table if the item is hidden - //! \param theIndex tree view model index - void onTreeViewVisibilityClicked(const QModelIndex& theIndex); - - //! Updates all controls by changed selection in OCAF tree view - //! \param theSelected list of selected tree view items - //! \param theDeselected list of deselected tree view items - void onTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Shows context menu for tree view selected item. It contains expand/collapse actions. - //! \param thePosition a clicked point - void onTreeViewContextMenuRequested(const QPoint& thePosition); - - //! Display content of selected tree view item if isToggled is true - //! \param isToggled true if the property dock widget is shown - void onPropertyPanelShown(bool isToggled); - - //! Update tree view item, preview presentation by item value change - void onPropertyViewDataChanged(); - - //! Update tree view header item width - void onHeaderResized(int theSectionId, int, int); - - //! Updates visibility states by erase all in context - void onEraseAllPerformed(); - - //! Export report into document - void onExportReport(); - - //! Create default report into document - void onCreateDefaultReport(); - - //! Iterates by children items of selected items and display its presentations if found - void onPreviewChildren(); - - //! Creates the table that sums the number of calls and - //! the time spent on the functionality inside the value. - void onMetricStatistic(); - - //! Switch active state in report for clicked type of metric - void OnActivateMetric(); - - //! Deactivate all types of metrics for the current report - void OnDeactivateAllMetrics(); - -protected: - //! Appends items to activate report metrics - void addActivateMetricActions(QMenu* theMenu); - - //! Returns displayer where the presentations/preview should be shown/erased - //! If default view is created, it returns displayer of this view - Standard_EXPORT View_Displayer* displayer(); - - //! Updates property panel content by item selected in tree view. - void updatePropertyPanelBySelection(); - - //!< Updates presentation of preview for parameter shapes. Creates a compound of the shapes - void updatePreviewPresentation(); - - //!< Sets reports metric columns visible if used - void updateVisibleColumns(); - -private: - QMainWindow* myMainWindow; //!< main control, parent for all MessageView controls - QDockWidget* myViewDockWidget; //!< view dock widget to hide/show - - QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget - ViewControl_PropertyView* - myPropertyView; //!< property control to display model item values if exist - - View_Window* myViewWindow; //!< OCC 3d view to visualize presentations - QTreeView* myTreeView; //!< tree view visualized shapes - MessageModel_Actions* myTreeViewActions; //!< processing history view actions - MessageView_ActionsTest* myTestViewActions; //!< check view actions - - QTableView* myCustomView; //!< table that units messages by name. - QDockWidget* myCustomPanelWidget; //!< panel for table that units messages by name. - - Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container - - Handle(AIS_InteractiveObject) - myPreviewPresentation; //!< presentation of preview for a selected object -}; - -#endif diff --git a/tools/ReadMe.md b/tools/ReadMe.md new file mode 100644 index 0000000000..c131fa2ae3 --- /dev/null +++ b/tools/ReadMe.md @@ -0,0 +1,18 @@ +# Inspector + +The Inspector component has been moved to a separate GitHub repository: +https://github.com/Open-Cascade-SAS/Inspector + +## Usage with DRAW + +To use the Inspector plugin in DRAW: + +1. Copy the required dynamic library files (.so, .dll) from the Inspector repository to your OCCT installation folder. For example, on Linux, you can copy the files to the `lib` directory in the OCCT installation directory. For windows, you can copy the files to the `bin` directory in the OCCT installation directory. +2. Load the plugin in your DRAW session + +## Documentation + +The documentation for Inspector is available at: +https://github.com/Open-Cascade-SAS/Inspector/tree/master/doc + +For more details on building and using the Inspector, please refer to the repository's documentation. diff --git a/tools/ShapeView/FILES b/tools/ShapeView/FILES deleted file mode 100644 index 09979b4e83..0000000000 --- a/tools/ShapeView/FILES +++ /dev/null @@ -1,19 +0,0 @@ -ShapeView.qrc -ShapeView_Communicator.cxx -ShapeView_Communicator.hxx -ShapeView_ItemRoot.cxx -ShapeView_ItemRoot.hxx -ShapeView_ItemShape.cxx -ShapeView_ItemShape.hxx -ShapeView_OpenFileDialog.cxx -ShapeView_OpenFileDialog.hxx -ShapeView_OpenFileViewModel.cxx -ShapeView_OpenFileViewModel.hxx -ShapeView_Tools.cxx -ShapeView_Tools.hxx -ShapeView_TreeModel.cxx -ShapeView_TreeModel.hxx -ShapeView_VisibilityState.cxx -ShapeView_VisibilityState.hxx -ShapeView_Window.cxx -ShapeView_Window.hxx diff --git a/tools/ShapeView/ShapeView.qrc b/tools/ShapeView/ShapeView.qrc deleted file mode 100644 index 331296a3d7..0000000000 --- a/tools/ShapeView/ShapeView.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - icons/folder_open.png - icons/folder_import.png - - diff --git a/tools/ShapeView/ShapeView_Communicator.cxx b/tools/ShapeView/ShapeView_Communicator.cxx deleted file mode 100644 index de416c86d3..0000000000 --- a/tools/ShapeView/ShapeView_Communicator.cxx +++ /dev/null @@ -1,25 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -// ======================================================================= -// function : CreateCommunicator -// purpose : Creates a communicator by the library loading -// ======================================================================= -Standard_EXPORTEXTERNC TInspectorAPI_Communicator* CreateCommunicator() -{ - return new ShapeView_Communicator(); -} diff --git a/tools/ShapeView/ShapeView_Communicator.hxx b/tools/ShapeView/ShapeView_Communicator.hxx deleted file mode 100644 index e2bfcffb78..0000000000 --- a/tools/ShapeView/ShapeView_Communicator.hxx +++ /dev/null @@ -1,78 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_Communicator_H -#define ShapeView_Communicator_H - -#include -#include - -//! \class ShapeView_Communicator. -//! \brief This is a connector from TInspector application to ShapeView window -class ShapeView_Communicator : public TInspectorAPI_Communicator -{ -public: - //! Constructor - ShapeView_Communicator() - : TInspectorAPI_Communicator(), - myWindow(new ShapeView_Window(0)) - { - } - - //! Destructor - virtual ~ShapeView_Communicator() { myWindow->RemoveAllShapes(); } - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - virtual void SetParent(void* theParent) Standard_OVERRIDE { myWindow->SetParent(theParent); } - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - virtual void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - Standard_OVERRIDE - { - myWindow->SetParameters(theParameters); - } - - //! Provides container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE - { - myWindow->FillActionsMenu(theMenu); - } - - //! Returns plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->GetPreferences(theItem); - } - - //! Stores plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->SetPreferences(theItem); - } - - //! Calls update of the plugin's content - virtual void UpdateContent() Standard_OVERRIDE { myWindow->UpdateContent(); } - -private: - ShapeView_Window* myWindow; //!< current window -}; - -#endif diff --git a/tools/ShapeView/ShapeView_ItemRoot.cxx b/tools/ShapeView/ShapeView_ItemRoot.cxx deleted file mode 100644 index eda68759cd..0000000000 --- a/tools/ShapeView/ShapeView_ItemRoot.cxx +++ /dev/null @@ -1,56 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -// ======================================================================= -// function : Shape -// purpose : -// ======================================================================= -const TopoDS_Shape& ShapeView_ItemRoot::Shape(const int theRowId) -{ - NCollection_List::Iterator aShapesIt(myShapes); - for (int aRowId = 0; aShapesIt.More(); aShapesIt.Next(), aRowId++) - { - if (aRowId == theRowId) - break; - } - return aShapesIt.Value(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant ShapeView_ItemRoot::initValue(const int theRole) const -{ - if (Column() != 0) - return QVariant(); - - if (theRole == Qt::DisplayRole || theRole == Qt::EditRole) - return "TopoDS_Shapes"; - - return QVariant(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr ShapeView_ItemRoot::createChild(int theRow, int theColumn) -{ - return ShapeView_ItemShape::CreateItem(currentItem(), theRow, theColumn); -} diff --git a/tools/ShapeView/ShapeView_ItemRoot.hxx b/tools/ShapeView/ShapeView_ItemRoot.hxx deleted file mode 100644 index 8c1cb9ec44..0000000000 --- a/tools/ShapeView/ShapeView_ItemRoot.hxx +++ /dev/null @@ -1,83 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_ItemRoot_H -#define ShapeView_ItemRoot_H - -#include -#include -#include -#include - -class ShapeView_ItemRoot; -typedef QExplicitlySharedDataPointer ShapeView_ItemRootPtr; - -//! \class ShapeView_ItemRoot -//! Collects shapes that should be visualized in tree view. Shapes are cached and if shapes are not -//! needed, cache should be cleared using RemoveAllShapes. Parent is NULL, children are -//! ShapeView_ItemShape items. -class ShapeView_ItemRoot : public TreeModel_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static ShapeView_ItemRootPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return ShapeView_ItemRootPtr(new ShapeView_ItemRoot(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~ShapeView_ItemRoot() {} - - //! Appends new shape - //! \param theShape a shape instance - void AddShape(const TopoDS_Shape& theShape) { myShapes.Append(theShape); } - - //! Clears internal container of added shapes - void RemoveAllShapes() { myShapes.Clear(); } - - //! Returns shape by the number - //! \param theRowId an index of the shape in the internal container. - Standard_EXPORT const TopoDS_Shape& Shape(const int theRowId); - -protected: - //! Returns data value for the role. - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! \return number of children. - virtual int initRowCount() const Standard_OVERRIDE { return myShapes.Size(); } - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! \param theParent a parent item - ShapeView_ItemRoot(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn) - { - } - -private: - NCollection_List myShapes; //!< shapes presented in tree view -}; - -#endif diff --git a/tools/ShapeView/ShapeView_ItemShape.cxx b/tools/ShapeView/ShapeView_ItemShape.cxx deleted file mode 100644 index 54ea4db21e..0000000000 --- a/tools/ShapeView/ShapeView_ItemShape.cxx +++ /dev/null @@ -1,183 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Shape -// purpose : -// ======================================================================= -TopoDS_Shape ShapeView_ItemShape::Shape(const int theRowId) const -{ - if (myChildShapes.IsEmpty()) - { - ShapeView_ItemShape* aThis = (ShapeView_ItemShape*)this; - - if (myExplodeType != TopAbs_SHAPE) - { - TopExp::MapShapes(myShape, myExplodeType, aThis->myChildShapes); - } - else - { - TopoDS_Iterator aSubShapeIt(myShape); - for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++) - { - aThis->myChildShapes.Add(aSubShapeIt.Value()); - } - } - } - if (myChildShapes.Extent() >= theRowId + 1) - return myChildShapes(theRowId + 1); - - return TopoDS_Shape(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant ShapeView_ItemShape::initValue(const int theRole) const -{ - QVariant aParentValue = TreeModel_ItemBase::initValue(theRole); - if (aParentValue.isValid()) - return aParentValue; - - TopoDS_Shape aShape = getShape(); - if (aShape.IsNull()) - return QVariant(); - - if (theRole != Qt::DisplayRole && theRole != Qt::ToolTipRole) - return QVariant(); - - switch (Column()) - { - case 0: - return TopAbs::ShapeTypeToString(aShape.ShapeType()); - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int ShapeView_ItemShape::initRowCount() const -{ - TopoDS_Shape aShape = getShape(); - if (aShape.IsNull()) - return 0; - - int aRowsCount = 0; - if (myExplodeType != TopAbs_SHAPE) - { - TopTools_IndexedMapOfShape aSubShapes; - TopExp::MapShapes(aShape, myExplodeType, aSubShapes); - aRowsCount = aSubShapes.Extent(); - } - else - { - for (TopoDS_Iterator aSubShapeIt(aShape); aSubShapeIt.More(); aSubShapeIt.Next()) - aRowsCount++; - } - return aRowsCount; -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void ShapeView_ItemShape::initStream(Standard_OStream& theOStream) const -{ - TopoDS_Shape aShape = getShape(); - if (aShape.IsNull()) - return; - - aShape.DumpJson(theOStream); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr ShapeView_ItemShape::createChild(int theRow, int theColumn) -{ - return ShapeView_ItemShape::CreateItem(currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void ShapeView_ItemShape::Init() -{ - ShapeView_ItemRootPtr aRootItem = itemDynamicCast(Parent()); - ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(Parent()); - myShape = aRootItem ? aRootItem->Shape(Row()) : aShapeItem->Shape(Row()); - - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : getShape -// purpose : -// ======================================================================= -TopoDS_Shape ShapeView_ItemShape::getShape() const -{ - initItem(); - return myShape; -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void ShapeView_ItemShape::Reset() -{ - myFileName = QString(); - myChildShapes.Clear(); - myShape = TopoDS_Shape(); - - TreeModel_ItemBase::Reset(); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void ShapeView_ItemShape::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} diff --git a/tools/ShapeView/ShapeView_ItemShape.hxx b/tools/ShapeView/ShapeView_ItemShape.hxx deleted file mode 100644 index 625b43d39e..0000000000 --- a/tools/ShapeView/ShapeView_ItemShape.hxx +++ /dev/null @@ -1,137 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_ItemShape_H -#define ShapeView_ItemShape_H - -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -class ShapeView_ItemShape; -typedef QExplicitlySharedDataPointer ShapeView_ItemShapePtr; - -//! \class ShapeView_ItemShape -//! This item is connected to TopoDS_Shape. -//! Parent is either ShapeView_ItemRoot or ShapeView_ItemShape, children are ShapeView_ItemShape or -//! no children -class ShapeView_ItemShape : public TreeModel_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - //! \return the pointer to the created item - static ShapeView_ItemShapePtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return ShapeView_ItemShapePtr(new ShapeView_ItemShape(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~ShapeView_ItemShape() {} - - //! Returns explode type of the item - TopAbs_ShapeEnum ExplodeType() const { return myExplodeType; } - - //! Sets explore type - //! \param theType type of item explode. If TopAbs_SHAPE, no explode, only iteration by shape - void SetExplodeType(const TopAbs_ShapeEnum theType) { myExplodeType = theType; } - - //! Returns the current shape - const TopoDS_Shape& GetItemShape() const - { - initItem(); - return myShape; - } - - //! Returns child(extracted) shape for the current shape by the index - //! \param theRowId an index of child shape - //! \returns shape instance or NULL - Standard_EXPORT TopoDS_Shape Shape(const int theRowId) const; - - //! Returns name of BREP file for the shape if exists - //! \return string value - QString GetFileName() const { return myFileName; } - - //! Sets name of BREP file for the shape if exists - //! \return string value - void SetFileName(const QString& theFileName) { myFileName = theFileName; } - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns data value for the role. - //! \param theRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theRole) const Standard_OVERRIDE; - - //! \return number of children. - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - -protected: - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - - //! Returns number of child shapes. Init item if it is not initialized - //! \return integer value - int getRowCount() const; - - //! Returns current shape, initialized item if it has not been initialized yet - //! \return shape value - TopoDS_Shape getShape() const; - -private: - //! Constructor - ShapeView_ItemShape(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn), - myExplodeType(TopAbs_SHAPE) - { - } - -private: - TopAbs_ShapeEnum myExplodeType; //!< type of explore own shape and get children - - TopoDS_Shape myShape; //!< current shape - QString myFileName; //!< BREP file name - - TopTools_IndexedMapOfShape myChildShapes; //!< cached container of child shapes -}; - -#endif diff --git a/tools/ShapeView/ShapeView_OpenFileDialog.cxx b/tools/ShapeView/ShapeView_OpenFileDialog.cxx deleted file mode 100644 index 3b5d0eba56..0000000000 --- a/tools/ShapeView/ShapeView_OpenFileDialog.cxx +++ /dev/null @@ -1,300 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -static const int ICON_SIZE = 40; - -static const int OPEN_DIALOG_WIDTH = 550; -static const int OPEN_DIALOG_HEIGHT = 200; - -static const int MARGIN_DIALOG = 4; -static const int SPACING_DIALOG = 2; - -// ======================================================================= -// function : StartButton -// purpose : -// ======================================================================= -QPushButton* ShapeView_OpenButton::StartButton() -{ - if (!myStartButton) - { - myStartButton = new QPushButton(); - myStartButton->setIcon(QIcon(":/icons/folder_open.png")); - connect(myStartButton, SIGNAL(clicked()), this, SLOT(onStartButtonClicked())); - } - return myStartButton; -} - -// ======================================================================= -// function : onStartButtonClicked -// purpose : -// ======================================================================= -void ShapeView_OpenButton::onStartButtonClicked() -{ - QString aDataDirName = QDir::currentPath(); - - QString aFileName = ShapeView_OpenFileDialog::OpenFile(0, aDataDirName); - aFileName = QDir().toNativeSeparators(aFileName); - if (!aFileName.isEmpty()) - { - QApplication::setOverrideCursor(Qt::WaitCursor); - emit OpenFile(aFileName); - QApplication::restoreOverrideCursor(); - } -} - -// ======================================================================= -// function : changeMargins -// purpose : -// ======================================================================= -void changeMargins(QBoxLayout* theLayout) -{ - theLayout->setContentsMargins(MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG); - theLayout->setSpacing(SPACING_DIALOG); -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ShapeView_OpenFileDialog::ShapeView_OpenFileDialog(QWidget* theParent, - const QString& theDataDirName) - : QDialog(theParent) -{ - setWindowTitle(theDataDirName); - myDataDir = theDataDirName; - - QVBoxLayout* aDialogLay = new QVBoxLayout(this); - changeMargins(aDialogLay); - - // Title label - QLabel* aTitleLabel = new QLabel(this); - aTitleLabel->setText(tr("Open File")); - aDialogLay->addWidget(aTitleLabel); - - // Samples View - QGroupBox* aSamplesBox = new QGroupBox(this); - aSamplesBox->setTitle(tr("Samples")); - aDialogLay->addWidget(aSamplesBox); - QVBoxLayout* aSampleLay = new QVBoxLayout(aSamplesBox); - changeMargins(aSampleLay); - mySamplesView = createTableView(readSampleNames()); - aSampleLay->addWidget(mySamplesView); - - // Select file - QGroupBox* aSelectFileBox = new QGroupBox(this); - aSelectFileBox->setTitle(tr("Select file")); - aDialogLay->addWidget(aSelectFileBox); - QGridLayout* aSelectFileLay = new QGridLayout(aSelectFileBox); - aSelectFileLay->setContentsMargins(MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG); - - mySelectedName = new QLineEdit(aSelectFileBox); - QCompleter* aCompleter = new QCompleter(); - QFileSystemModel* aFileSystemModel = new QFileSystemModel; - aFileSystemModel->setRootPath(QDir::rootPath()); - aCompleter->setModel(aFileSystemModel); - mySelectedName->setCompleter(aCompleter); - aSelectFileLay->addWidget(mySelectedName, 1, 0); - - QToolButton* aSelectFileBtn = new QToolButton(aSelectFileBox); - aSelectFileBtn->setIcon(QIcon(":/icons/folder_open.png")); - aSelectFileLay->addWidget(aSelectFileBtn, 1, 1); - - myFolderApplyOpen = new QToolButton(aSelectFileBox); - myFolderApplyOpen->setIcon(QIcon(":/icons/folder_import.png")); - myFolderApplyOpen->setIconSize(QSize(ICON_SIZE, ICON_SIZE)); - myFolderApplyOpen->setEnabled(false); - aSelectFileLay->addWidget(myFolderApplyOpen, 0, 2, 2, 1); - - connect(mySelectedName, - SIGNAL(textChanged(const QString&)), - this, - SLOT(onNameChanged(const QString&))); - connect(aSelectFileBtn, SIGNAL(clicked()), this, SLOT(onSelectClicked())); - connect(myFolderApplyOpen, SIGNAL(clicked()), this, SLOT(onApplySelectClicked())); - - resize(OPEN_DIALOG_WIDTH, OPEN_DIALOG_HEIGHT); -} - -// ======================================================================= -// function : OpenFile -// purpose : -// ======================================================================= -QString ShapeView_OpenFileDialog::OpenFile(QWidget* theParent, const QString& theDataDirName) -{ - QString aFileName; - ShapeView_OpenFileDialog* aDialog = new ShapeView_OpenFileDialog(theParent, theDataDirName); - if (aDialog->exec() == QDialog::Accepted) - aFileName = aDialog->GetFileName(); - - return aFileName; -} - -// ======================================================================= -// function : onSampleSelectionChanged -// purpose : -// ======================================================================= -void ShapeView_OpenFileDialog::onSampleSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - QItemSelectionModel* aSelectionModel = (QItemSelectionModel*)sender(); - if (!aSelectionModel) - return; - if (theSelected.isEmpty()) - return; - - QModelIndex anIndex = theSelected.first().indexes().first(); - if (!anIndex.isValid()) - return; - - myFileName = aSelectionModel->model()->data(anIndex, Qt::ToolTipRole).toString(); - accept(); -} - -// ======================================================================= -// function : onNameChanged -// purpose : -// ======================================================================= -void ShapeView_OpenFileDialog::onNameChanged(const QString& theText) -{ - QFileInfo aFileInfo(theText); - bool anExists = aFileInfo.exists() && aFileInfo.isFile(); - myFolderApplyOpen->setEnabled(anExists); -} - -// ======================================================================= -// function : onSelectClicked -// purpose : -// ======================================================================= -void ShapeView_OpenFileDialog::onSelectClicked() -{ - QString anEnteredPath; - QString aDirName = mySelectedName->text(); - if (!aDirName.isEmpty()) - { - QDir aDir(aDirName); - if (aDir.exists()) - anEnteredPath = aDirName; - } - - QString aFilter(tr("BREP file (*.brep*)")); - QString aFileName = QFileDialog::getOpenFileName(0, "Open document", anEnteredPath, aFilter); - - if (aFileName.isEmpty()) - return; // do nothing, left the previous value - - mySelectedName->setText(aFileName); - onNameChanged(aFileName); -} - -// ======================================================================= -// function : onApplySelectClicked -// purpose : -// ======================================================================= -void ShapeView_OpenFileDialog::onApplySelectClicked() -{ - myFileName = mySelectedName->text(); - accept(); -} - -// ======================================================================= -// function : createTableView -// purpose : -// ======================================================================= -QTableView* ShapeView_OpenFileDialog::createTableView(const QStringList& theFileNames) -{ - QTableView* aTableView = new QTableView(this); - aTableView->setFrameStyle(QFrame::NoFrame); - QPalette aPalette = aTableView->viewport()->palette(); - QColor aWindowColor = aPalette.color(QPalette::Window); - aPalette.setBrush(QPalette::Base, aWindowColor); - aTableView->viewport()->setPalette(aPalette); - - aTableView->horizontalHeader()->setVisible(false); - aTableView->verticalHeader()->setVisible(false); - aTableView->setGridStyle(Qt::NoPen); - aTableView->setModel(createModel(theFileNames)); - aTableView->setItemDelegateForRow( - 0, - new ShapeView_OpenFileItemDelegate(aTableView, aPalette.color(QPalette::Highlight))); - aTableView->viewport()->setAttribute(Qt::WA_Hover); - int aCellHeight = ICON_SIZE + aTableView->verticalHeader()->defaultSectionSize(); - aTableView->setRowHeight(0, aCellHeight); - int aScrollHeight = aTableView->horizontalScrollBar()->sizeHint().height(); - aTableView->setMinimumHeight(aCellHeight + aScrollHeight); - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(aTableView->model()); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onSampleSelectionChanged(const QItemSelection&, const QItemSelection&))); - aTableView->setSelectionModel(aSelectionModel); - - return aTableView; -} - -// ======================================================================= -// function : createModel -// purpose : -// ======================================================================= -QAbstractItemModel* ShapeView_OpenFileDialog::createModel(const QStringList& theFileNames) -{ - ShapeView_OpenFileViewModel* aModel = new ShapeView_OpenFileViewModel(this); - aModel->Init(theFileNames); - return aModel; -} - -// ======================================================================= -// function : readSampleNames -// purpose : -// ======================================================================= -QStringList ShapeView_OpenFileDialog::readSampleNames() -{ - QStringList aNames; - - QDir aDir(myDataDir); - aDir.setSorting(QDir::Name); - - QFileInfoList aDirEntries = aDir.entryInfoList(); - for (int aDirId = 0; aDirId < aDirEntries.size(); ++aDirId) - { - QFileInfo aFileInfo = aDirEntries.at(aDirId); - if (aFileInfo.isFile()) - aNames.append(aFileInfo.absoluteFilePath()); - } - return aNames; -} diff --git a/tools/ShapeView/ShapeView_OpenFileDialog.hxx b/tools/ShapeView/ShapeView_OpenFileDialog.hxx deleted file mode 100644 index 301f32b162..0000000000 --- a/tools/ShapeView/ShapeView_OpenFileDialog.hxx +++ /dev/null @@ -1,149 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_OpenFileDialog_H -#define ShapeView_OpenFileDialog_H - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -class QAbstractItemModel; -class QLineEdit; -class QPushButton; -class QTableView; -class QToolButton; -class QWidget; - -//! \class ShapeView_OpenButton -//! Class that contains push button and the button processing. It obtains a file name from the -//! default or current directory and gives the name into TInspector communicator Object name of the -//! button is the name of the plugin to get the default directory, or the current directory is used. -class ShapeView_OpenButton : public QObject -{ - Q_OBJECT -public: - //! Constructor - ShapeView_OpenButton(QObject* theParent) - : QObject(theParent), - myStartButton(0) - { - } - - //! Destructor - virtual ~ShapeView_OpenButton() {} - - //! Returns the start button, if this is the first call, it creates the button and connect it to - //! the slot - Standard_EXPORT QPushButton* StartButton(); - - //! Sets the default directory of plugin. - void SetPluginDir(const TCollection_AsciiString& thePluginName, - const TCollection_AsciiString& theDefaultDir) - { - myDefaultDirs[thePluginName] = theDefaultDir; - } - -private slots: - - //! Processes the button click, open default/current directory to select open file, calls OpenFile - //! of communicator - void onStartButtonClicked(); - -signals: - - //! Signals about opening file clicked - //! \param theFileName an output file name - void OpenFile(const QString& theFileName); - -private: - QPushButton* myStartButton; //!< processed button - std::map - myDefaultDirs; //!< plugins default directories -}; - -//! \class ShapeView_OpenFileDialog -//! Control that contains table view of samples and line to select a file name from other directory. -//! Click on element of samples table view calls this sample opening else after entering(or opening) -//! file name the import becomes active. Click on the button will open selected file if it is -//! possible -class ShapeView_OpenFileDialog : public QDialog -{ - Q_OBJECT -private: - //! Constructor - ShapeView_OpenFileDialog(QWidget* theParent, const QString& theDataDirName); - -public: - //! Destructor - virtual ~ShapeView_OpenFileDialog() Standard_OVERRIDE {} - - //! Opens this file dialog using for samples view the given directory and try to open new file - //! \param theParent a parent for the new dialog - //! \param theDataDirName path to default samples directory - //! \returns a file name from the open file dialog - static QString OpenFile(QWidget* theParent, const QString& theDataDirName); - - //! Returns selection name from the dialog - QString GetFileName() const { return myFileName; } - -private slots: - - //! Stores name of selected sample file - void onSampleSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Updates enabling state of Open file button, it is enabled if the file by the entered path - //! exists \param theText a file name text in line edit - void onNameChanged(const QString& theText); - - //! Open file dialog to select a file name. Fills file name line, enable import button - void onSelectClicked(); - - //! Accepts open file dialog - void onApplySelectClicked(); - -private: - //! Creates view of file names in samples directory - //! \param theFileNames a container of names - //! \return table view - QTableView* createTableView(const QStringList& theFileNames); - - //! Creates view model and fills it by the file names - //! \param theFileNames a container of names - //! \return model - QAbstractItemModel* createModel(const QStringList& theFileNames); - - //! Generates container of file names in samples directory - //! \return container of names - QStringList readSampleNames(); - -private: - QString myDataDir; //!< samples directory - QString myFileName; //!< result file name - QTableView* mySamplesView; //!< view of sample file names - QLineEdit* mySelectedName; //!< alternative control to open file - QToolButton* myFolderApplyOpen; //!< button to open file -}; - -#endif diff --git a/tools/ShapeView/ShapeView_OpenFileViewModel.cxx b/tools/ShapeView/ShapeView_OpenFileViewModel.cxx deleted file mode 100644 index 8f4717ae9f..0000000000 --- a/tools/ShapeView/ShapeView_OpenFileViewModel.cxx +++ /dev/null @@ -1,80 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include - -const int ICON_SIZE = 40; - -// ======================================================================= -// function : paint -// purpose : -// ======================================================================= -void ShapeView_OpenFileItemDelegate::paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const -{ - // highlight cell - if (theOption.state & QStyle::State_MouseOver) - thePainter->fillRect(theOption.rect, myColor); - - // action icon for all indices before the last one - QIcon anIcon(":/icons/folder_import.png"); - QSize anIconSize(ICON_SIZE, ICON_SIZE); - int aDX = (theOption.rect.width() - anIconSize.width()) / 2; - int aMargin = qApp->style()->pixelMetric(QStyle::PM_HeaderMargin); - thePainter->drawPixmap(QRect(theOption.rect.left() + aDX, - theOption.rect.top() + aMargin, - anIconSize.width(), - anIconSize.height()), - anIcon.pixmap(anIconSize.width(), anIconSize.height())); - // default paint - QItemDelegate::paint(thePainter, theOption, theIndex); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void ShapeView_OpenFileViewModel::Init(const QStringList& theValues) -{ - myValues = theValues; -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant ShapeView_OpenFileViewModel::data(const QModelIndex& theIndex, int theRole) const -{ - switch (theRole) - { - case Qt::DisplayRole: - return QFileInfo(myValues[theIndex.column()]).fileName(); - case Qt::ToolTipRole: - return myValues[theIndex.column()]; - case Qt::TextAlignmentRole: - return QVariant(Qt::AlignBottom | Qt::AlignHCenter); - default: - break; - } - return QVariant(); -} diff --git a/tools/ShapeView/ShapeView_OpenFileViewModel.hxx b/tools/ShapeView/ShapeView_OpenFileViewModel.hxx deleted file mode 100644 index 945902d944..0000000000 --- a/tools/ShapeView/ShapeView_OpenFileViewModel.hxx +++ /dev/null @@ -1,106 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_OpenFileViewModel_H -#define ShapeView_OpenFileViewModel_H - -#include -#include - -#include -#include -#include -#include -#include - -class QObject; -class QPainter; - -//! \class ShapeView_OpenFileItemDelegate -//! Draws large(40x40) icons in cell. The icon background in colored in highlight when mouse is over -//! button -class ShapeView_OpenFileItemDelegate : public QItemDelegate -{ -public: - //! Constructor - ShapeView_OpenFileItemDelegate(QObject* theParent, const QColor& theHighlight) - : QItemDelegate(theParent), - myColor(theHighlight) - { - } - - //! Destructor - virtual ~ShapeView_OpenFileItemDelegate() {} - - //! Draws an icon in the cell - //! \param thePainter a painter - //! \param theOption a paint options - //! \param theIndex a view index - Standard_EXPORT void paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const; - -private: - QColor myColor; //!< highlight color -}; - -//! \class ShapeView_OpenFileViewModel -//! Table model that visualizes container of string values (file names) -//! Table orientation is horizontal, it has 1 row, number of columns equals to number of values -class ShapeView_OpenFileViewModel : public QAbstractTableModel -{ -public: - //! Constructor - ShapeView_OpenFileViewModel(QObject* theParent = 0) - : QAbstractTableModel(theParent) - { - } - - //! Destructor - virtual ~ShapeView_OpenFileViewModel() {} - - //! Stores values - //! \param theValues a container of values to fill model - void Init(const QStringList& theValues); - - //! Returns content of the model index for the given role, it is obtained from internal container - //! of values It returns value only for DisplayRole. \param theIndex a model index \param theRole - //! a view role \return value interpreted depending on the given role - virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns number of rows - //! \param theParent an index of the parent item - //! \return an integer value - virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 1; - } - - //! Returns number of columns - //! \param theParent an index of the parent item - //! \return an integer value - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return myValues.size(); - } - -private: - QStringList myValues; //!< file names -}; - -#endif diff --git a/tools/ShapeView/ShapeView_Tools.cxx b/tools/ShapeView/ShapeView_Tools.cxx deleted file mode 100644 index 002d30a0f7..0000000000 --- a/tools/ShapeView/ShapeView_Tools.cxx +++ /dev/null @@ -1,48 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include - -#include -#include - -// ======================================================================= -// function : IsPossibleToExplode -// purpose : -// ======================================================================= -Standard_Boolean ShapeView_Tools::IsPossibleToExplode( - const TopoDS_Shape& theShape, - NCollection_List& theExplodeTypes) -{ - TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); - - if (!theExplodeTypes.Contains(aShapeType)) - theExplodeTypes.Append(aShapeType); - - if (theExplodeTypes.Extent() == TopAbs_SHAPE + 1) // all types are collected, stop - return Standard_True; - - TopoDS_Iterator aSubShapeIt(theShape); - for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++) - { - if (IsPossibleToExplode(aSubShapeIt.Value(), theExplodeTypes)) - return Standard_True; - } - return Standard_False; -} diff --git a/tools/ShapeView/ShapeView_Tools.hxx b/tools/ShapeView/ShapeView_Tools.hxx deleted file mode 100644 index 462905c113..0000000000 --- a/tools/ShapeView/ShapeView_Tools.hxx +++ /dev/null @@ -1,50 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_Tools_H -#define ShapeView_Tools_H - -#include - -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -//! \class ShapeView_Tools -//! It gives auxiliary methods for TopoDS_Shape manipulation -class ShapeView_Tools -{ -public: - //! Checks whether it is possible to explode the shape. The search is recursive until all types - //! are collected. \param[in] theShape source shape object \param[out] theExplodeTypes container - //! of possible shape types to be exploded \return true if explode is finished, all types are - //! collected. - Standard_EXPORT static Standard_Boolean IsPossibleToExplode( - const TopoDS_Shape& theShape, - NCollection_List& theExplodeTypes); -}; - -#endif diff --git a/tools/ShapeView/ShapeView_TreeModel.cxx b/tools/ShapeView/ShapeView_TreeModel.cxx deleted file mode 100644 index 480ea854f7..0000000000 --- a/tools/ShapeView/ShapeView_TreeModel.cxx +++ /dev/null @@ -1,89 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ShapeView_TreeModel::ShapeView_TreeModel(QObject* theParent) - : TreeModel_ModelBase(theParent) -{ -} - -// ======================================================================= -// function : createRootItem -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr ShapeView_TreeModel::createRootItem(const int theColumnId) -{ - return ShapeView_ItemRoot::CreateItem(TreeModel_ItemBasePtr(), 0, theColumnId); -} - -// ======================================================================= -// function : AddShape -// purpose : -// ======================================================================= -void ShapeView_TreeModel::AddShape(const TopoDS_Shape& theShape) -{ - for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) - { - ShapeView_ItemRootPtr aRootItem = itemDynamicCast(RootItem(aColId)); - aRootItem->AddShape(theShape); - } - - Reset(); - EmitLayoutChanged(); -} - -// ======================================================================= -// function : RemoveAllShapes -// purpose : -// ======================================================================= -void ShapeView_TreeModel::RemoveAllShapes() -{ - for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) - { - ShapeView_ItemRootPtr aRootItem = itemDynamicCast(RootItem(aColId)); - aRootItem->RemoveAllShapes(); - } - Reset(); - EmitLayoutChanged(); -} - -// ======================================================================= -// function : FindIndex -// purpose : -// ======================================================================= -QModelIndex ShapeView_TreeModel::FindIndex(const TopoDS_Shape& theShape) const -{ - QModelIndex aParentIndex = index(0, 0); - TreeModel_ItemBasePtr aParentItem = - TreeModel_ModelBase::GetItemByIndex(aParentIndex); // application item - for (int aChildId = 0, aCount = aParentItem->rowCount(); aChildId < aCount; aChildId++) - { - QModelIndex anIndex = index(aChildId, 0, aParentIndex); - ShapeView_ItemShapePtr anItem = - itemDynamicCast(TreeModel_ModelBase::GetItemByIndex(anIndex)); - if (anItem && anItem->GetItemShape() == theShape) - return anIndex; - } - return QModelIndex(); -} diff --git a/tools/ShapeView/ShapeView_TreeModel.hxx b/tools/ShapeView/ShapeView_TreeModel.hxx deleted file mode 100644 index afe6c3078f..0000000000 --- a/tools/ShapeView/ShapeView_TreeModel.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_TreeModel_H -#define ShapeView_TreeModel_H - -#include -#include -#include -#include - -#include -#include -#include -#include - -class ShapeView_TreeModel; - -//! \class ShapeView_TreeModel -//! View model to visualize content of TopoDS_Shape -class ShapeView_TreeModel : public TreeModel_ModelBase -{ -public: - //! Constructor - Standard_EXPORT ShapeView_TreeModel(QObject* theParent); - - //! Destructor - virtual ~ShapeView_TreeModel() {} - - //! Adds shape, append it to the model root item - //! \param theShape a shape instance - Standard_EXPORT void AddShape(const TopoDS_Shape& theShape); - - //! Removes all shapes in the model root item - Standard_EXPORT void RemoveAllShapes(); - - //! Returns model index of the shape. - //! \param theShape a shape object - //! \return the model index - QModelIndex FindIndex(const TopoDS_Shape& theShape) const; - -protected: - //! Creates root item - //! \param theColumnId index of a column - Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) - Standard_OVERRIDE; -}; - -#endif diff --git a/tools/ShapeView/ShapeView_VisibilityState.cxx b/tools/ShapeView/ShapeView_VisibilityState.cxx deleted file mode 100644 index 88fe00db78..0000000000 --- a/tools/ShapeView/ShapeView_VisibilityState.cxx +++ /dev/null @@ -1,64 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -// ======================================================================= -// function : OnClicked -// purpose : -// ======================================================================= -void ShapeView_VisibilityState::OnClicked(const QModelIndex& theIndex) -{ - processClicked(theIndex); - emit itemClicked(theIndex); -} - -// ======================================================================= -// function : SetVisible -// purpose : -// ======================================================================= -bool ShapeView_VisibilityState::SetVisible(const QModelIndex& theIndex, - const bool theState, - const bool toEmitDataChanged) -{ - TopoDS_Shape aShape = Shape(theIndex); - if (aShape.IsNull()) - return false; - - myDisplayer->SetVisible(aShape, theState, myPresentationType); - - if (toEmitDataChanged) - getModel()->EmitDataChanged(theIndex, theIndex); - return true; -} - -// ======================================================================= -// function : Shape -// purpose : -// ======================================================================= -TopoDS_Shape ShapeView_VisibilityState::Shape(const QModelIndex& theIndex) const -{ - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(theIndex); - if (!anItemBase) - return TopoDS_Shape(); - - ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(anItemBase); - if (!aShapeItem) - return TopoDS_Shape(); - - return aShapeItem->GetItemShape(); -} diff --git a/tools/ShapeView/ShapeView_VisibilityState.hxx b/tools/ShapeView/ShapeView_VisibilityState.hxx deleted file mode 100644 index 2b8d8359c2..0000000000 --- a/tools/ShapeView/ShapeView_VisibilityState.hxx +++ /dev/null @@ -1,98 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_VisibilityState_H -#define ShapeView_VisibilityState_H - -#include - -#include - -#include -#include -#include - -class TreeModel_ModelBase; - -//! \class ShapeView_VisibilityState -//! \brief Class provides connection between model and visualization control -class ShapeView_VisibilityState : public QObject, public TreeModel_VisibilityState -{ - Q_OBJECT -public: - //! Constructor - ShapeView_VisibilityState(TreeModel_ModelBase* theModel) - : TreeModel_VisibilityState(theModel), - myPresentationType(View_PresentationType_Main) - { - } - - //! Destructor - ~ShapeView_VisibilityState() {} - - //! Sets current displayer - //! \theDisplayer class that provides connection to visualized objects - void SetDisplayer(View_Displayer* theDisplayer) { myDisplayer = theDisplayer; } - - //! Sets presentation type for displayer - //! \param theType type value - void SetPresentationType(const View_PresentationType theType) { myPresentationType = theType; } - - //! Returns true if visibility of the item can be changed - //! \param theIndex tree model index - //! \return boolean value - virtual bool CanBeVisible(const QModelIndex& theIndex) const Standard_OVERRIDE - { - return !Shape(theIndex).IsNull(); - } - - //! Sets visibility state - //! \theIndex tree model index - //! \param theState visibility state - //! \param toEmitDataChanged boolean flag whether emit of the model should be done immediately - //! \return true if state is changed - Standard_EXPORT virtual bool SetVisible(const QModelIndex& theIndex, - const bool theState, - const bool toEmitDataChanged) Standard_OVERRIDE; - - //! Returns visibility state value - virtual bool IsVisible(const QModelIndex& theIndex) const Standard_OVERRIDE - { - return myDisplayer->IsVisible(Shape(theIndex), myPresentationType); - } - -public slots: - //! Processes the mouse clicked on the index. - //! It changes the item visibility if model allows to change it. - //! \theIndex tree model index - void OnClicked(const QModelIndex& theIndex); - -signals: - //! Signal after OnClicked is performed - //! \theIndex tree model index - void itemClicked(const QModelIndex& theIndex); - -protected: - //! Gets shape of the view model by the parameter index if it has a shape - //! \param theIndex tree model index - //! \return shape instance - TopoDS_Shape Shape(const QModelIndex& theIndex) const; - -private: - View_Displayer* myDisplayer; //!< view displayer - View_PresentationType myPresentationType; //!< presentation type -}; - -#endif diff --git a/tools/ShapeView/ShapeView_Window.cxx b/tools/ShapeView/ShapeView_Window.cxx deleted file mode 100644 index 2f2b559415..0000000000 --- a/tools/ShapeView/ShapeView_Window.cxx +++ /dev/null @@ -1,552 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const int DEFAULT_SHAPE_VIEW_WIDTH = 900; -static const int DEFAULT_SHAPE_VIEW_HEIGHT = 450; -static const int DEFAULT_SHAPE_VIEW_POSITION_X = 60; -static const int DEFAULT_SHAPE_VIEW_POSITION_Y = 60; - -static const int SHAPEVIEW_DEFAULT_TREE_VIEW_WIDTH = 600; -static const int SHAPEVIEW_DEFAULT_TREE_VIEW_HEIGHT = 500; - -static const int SHAPEVIEW_DEFAULT_VIEW_WIDTH = 300; -static const int SHAPEVIEW_DEFAULT_VIEW_HEIGHT = 1000; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ShapeView_Window::ShapeView_Window(QWidget* theParent) - : QObject(theParent) -{ - myMainWindow = new QMainWindow(theParent); - - myTreeView = new ViewControl_TreeView(myMainWindow); - ((ViewControl_TreeView*)myTreeView) - ->SetPredefinedSize( - QSize(SHAPEVIEW_DEFAULT_TREE_VIEW_WIDTH, SHAPEVIEW_DEFAULT_TREE_VIEW_HEIGHT)); - myTreeView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(myTreeView, - SIGNAL(customContextMenuRequested(const QPoint&)), - this, - SLOT(onTreeViewContextMenuRequested(const QPoint&))); - new TreeModel_ContextMenu(myTreeView); - ShapeView_TreeModel* aModel = new ShapeView_TreeModel(myTreeView); - aModel->InitColumns(); - - myTreeView->setModel(aModel); - ShapeView_VisibilityState* aVisibilityState = new ShapeView_VisibilityState(aModel); - aModel->SetVisibilityState(aVisibilityState); - TreeModel_Tools::UseVisibilityColumn(myTreeView); - QObject::connect(myTreeView, - SIGNAL(clicked(const QModelIndex&)), - aVisibilityState, - SLOT(OnClicked(const QModelIndex&))); - - QItemSelectionModel* aSelModel = new QItemSelectionModel(myTreeView->model(), myTreeView); - myTreeView->setSelectionModel(aSelModel); - connect(aSelModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&))); - - QModelIndex aParentIndex = myTreeView->model()->index(0, 0); - myTreeView->setExpanded(aParentIndex, true); - myMainWindow->setCentralWidget(myTreeView); - - // property view - myPropertyView = new ViewControl_PropertyView( - myMainWindow, - QSize(SHAPEVIEW_DEFAULT_VIEW_WIDTH, SHAPEVIEW_DEFAULT_VIEW_HEIGHT)); - myPropertyPanelWidget = new QDockWidget(tr("PropertyPanel"), myMainWindow); - myPropertyPanelWidget->setObjectName(myPropertyPanelWidget->windowTitle()); - myPropertyPanelWidget->setTitleBarWidget(new QWidget(myMainWindow)); - myPropertyPanelWidget->setWidget(myPropertyView->GetControl()); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, myPropertyPanelWidget); - - // view - myViewWindow = new View_Window(myMainWindow, NULL, false); - connect(myViewWindow, SIGNAL(eraseAllPerformed()), this, SLOT(onEraseAllPerformed())); - aVisibilityState->SetDisplayer(myViewWindow->Displayer()); - aVisibilityState->SetPresentationType(View_PresentationType_Main); - myViewWindow->SetPredefinedSize(SHAPEVIEW_DEFAULT_VIEW_WIDTH, SHAPEVIEW_DEFAULT_VIEW_HEIGHT); - - QDockWidget* aViewDockWidget = new QDockWidget(tr("View"), myMainWindow); - aViewDockWidget->setObjectName(aViewDockWidget->windowTitle()); - aViewDockWidget->setWidget(myViewWindow); - aViewDockWidget->setTitleBarWidget(myViewWindow->ViewToolBar()->GetControl()); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, aViewDockWidget); - - myMainWindow->splitDockWidget(myPropertyPanelWidget, aViewDockWidget, Qt::Vertical); - - myMainWindow->resize(DEFAULT_SHAPE_VIEW_WIDTH, DEFAULT_SHAPE_VIEW_HEIGHT); - myMainWindow->move(DEFAULT_SHAPE_VIEW_POSITION_X, DEFAULT_SHAPE_VIEW_POSITION_Y); -} - -// ======================================================================= -// function : Destructor -// purpose : -// ======================================================================= -ShapeView_Window::~ShapeView_Window() {} - -// ======================================================================= -// function : SetParent -// purpose : -// ======================================================================= -void ShapeView_Window::SetParent(void* theParent) -{ - QWidget* aParent = (QWidget*)theParent; - if (aParent) - { - QLayout* aLayout = aParent->layout(); - if (aLayout) - aLayout->addWidget(GetMainWindow()); - } -} - -// ======================================================================= -// function : FillActionsMenu -// purpose : -// ======================================================================= -void ShapeView_Window::FillActionsMenu(void* theMenu) -{ - QMenu* aMenu = (QMenu*)theMenu; - QList aDockwidgets = myMainWindow->findChildren(); - for (QList::iterator it = aDockwidgets.begin(); it != aDockwidgets.end(); ++it) - { - QDockWidget* aDockWidget = *it; - if (aDockWidget->parentWidget() == myMainWindow) - aMenu->addAction(aDockWidget->toggleViewAction()); - } -} - -// ======================================================================= -// function : GetPreferences -// purpose : -// ======================================================================= -void ShapeView_Window::GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) -{ - theItem.Bind("geometry", - TreeModel_Tools::ToString(myMainWindow->saveState()).toStdString().c_str()); - - QMap anItems; - TreeModel_Tools::SaveState(myTreeView, anItems); - View_Window::SaveState(myViewWindow, anItems); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); -} - -// ======================================================================= -// function : SetPreferences -// purpose : -// ======================================================================= -void ShapeView_Window::SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) -{ - if (theItem.IsEmpty()) - { - TreeModel_Tools::SetDefaultHeaderSections(myTreeView); - return; - } - - for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt(theItem); anItemIt.More(); - anItemIt.Next()) - { - if (anItemIt.Key().IsEqual("geometry")) - myMainWindow->restoreState(TreeModel_Tools::ToByteArray(anItemIt.Value().ToCString())); - else if (TreeModel_Tools::RestoreState(myTreeView, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - else if (View_Window::RestoreState(myViewWindow, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - } -} - -// ======================================================================= -// function : UpdateContent -// purpose : -// ======================================================================= -void ShapeView_Window::UpdateContent() -{ - TCollection_AsciiString aName = "TKShapeView"; - if (myParameters->FindParameters(aName)) - { - NCollection_List aParameters = myParameters->Parameters(aName); - // Init will remove from parameters those, that are processed only one time (TShape) - Init(aParameters); - myParameters->SetParameters(aName, aParameters); - } - if (myParameters->FindFileNames(aName)) - { - for (NCollection_List::Iterator aFilesIt( - myParameters->FileNames(aName)); - aFilesIt.More(); - aFilesIt.Next()) - OpenFile(aFilesIt.Value()); - - NCollection_List aNames; - myParameters->SetFileNames(aName, aNames); - } - // make TopoDS_TShape selected if exist in select parameters - NCollection_List anObjects; - if (myParameters->GetSelectedObjects(aName, anObjects)) - { - ShapeView_TreeModel* aModel = dynamic_cast(myTreeView->model()); - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - aSelectionModel->clear(); - for (NCollection_List::Iterator aParamsIt(anObjects); - aParamsIt.More(); - aParamsIt.Next()) - { - Handle(Standard_Transient) anObject = aParamsIt.Value(); - Handle(TopoDS_TShape) aShapePointer = Handle(TopoDS_TShape)::DownCast(anObject); - if (aShapePointer.IsNull()) - continue; - - TopoDS_Shape aShape; - aShape.TShape(aShapePointer); - - QModelIndex aShapeIndex = aModel->FindIndex(aShape); - if (!aShapeIndex.isValid()) - continue; - aSelectionModel->select(aShapeIndex, QItemSelectionModel::Select); - myTreeView->scrollTo(aShapeIndex); - } - myParameters->SetSelected(aName, NCollection_List()); - } -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void ShapeView_Window::Init(NCollection_List& theParameters) -{ - Handle(AIS_InteractiveContext) aContext; - NCollection_List aParameters; - - TCollection_AsciiString aPluginName("TKShapeView"); - NCollection_List aSelectedParameters; - if (myParameters->FindSelectedNames(aPluginName)) // selected names have TShape parameters - aSelectedParameters = myParameters->GetSelectedNames(aPluginName); - - NCollection_List::Iterator aParamsIt(aSelectedParameters); - for (NCollection_List::Iterator anObjectsIt(theParameters); - anObjectsIt.More(); - anObjectsIt.Next()) - { - Handle(Standard_Transient) anObject = anObjectsIt.Value(); - Handle(TopoDS_TShape) aShapePointer = Handle(TopoDS_TShape)::DownCast(anObject); - if (!aShapePointer.IsNull()) - { - TopoDS_Shape aShape; - aShape.TShape(aShapePointer); - if (aParamsIt.More()) - { - // each Transient object has own location/orientation description - TInspectorAPI_PluginParameters::ParametersToShape(aParamsIt.Value(), aShape); - aParamsIt.Next(); - } - addShape(aShape); - } - else - { - aParameters.Append(anObject); - if (aContext.IsNull()) - aContext = Handle(AIS_InteractiveContext)::DownCast(anObject); - } - } - if (!aContext.IsNull()) - myViewWindow->SetContext(View_ContextType_External, aContext); - - theParameters = aParameters; - myParameters->SetSelectedNames(aPluginName, NCollection_List()); -} - -// ======================================================================= -// function : OpenFile -// purpose : -// ======================================================================= -void ShapeView_Window::OpenFile(const TCollection_AsciiString& theFileName) -{ - TopoDS_Shape aShape = Convert_Tools::ReadShape(theFileName); - if (!aShape.IsNull()) - addShape(aShape); -} - -// ======================================================================= -// function : RemoveAllShapes -// purpose : -// ======================================================================= -void ShapeView_Window::RemoveAllShapes() -{ - ShapeView_TreeModel* aModel = dynamic_cast(myTreeView->model()); - aModel->RemoveAllShapes(); -} - -// ======================================================================= -// function : addShape -// purpose : -// ======================================================================= -void ShapeView_Window::addShape(const TopoDS_Shape& theShape) -{ - ShapeView_TreeModel* aModel = dynamic_cast(myTreeView->model()); - aModel->AddShape(theShape); -} - -// ======================================================================= -// function : onTreeViewContextMenuRequested -// purpose : -// ======================================================================= -void ShapeView_Window::onTreeViewContextMenuRequested(const QPoint& thePosition) -{ - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - return; - - QMenu* aMenu = new QMenu(myMainWindow); - ShapeView_ItemRootPtr aRootItem = itemDynamicCast(anItemBase); - if (aRootItem) - { - aMenu->addAction( - ViewControl_Tools::CreateAction("Load BREP file", SLOT(onLoadFile()), myMainWindow, this)); - aMenu->addAction(ViewControl_Tools::CreateAction("Remove all shape items", - SLOT(onClearView()), - myMainWindow, - this)); - } - else - { - aMenu->addAction(ViewControl_Tools::CreateAction("Export to BREP", - SLOT(onExportToBREP()), - myMainWindow, - this)); - ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(anItemBase); - const TopoDS_Shape& aShape = aShapeItem->GetItemShape(); - TopAbs_ShapeEnum anExplodeType = aShapeItem->ExplodeType(); - NCollection_List anExplodeTypes; - ShapeView_Tools::IsPossibleToExplode(aShape, anExplodeTypes); - if (anExplodeTypes.Size() > 0) - { - QMenu* anExplodeMenu = aMenu->addMenu("Explode"); - for (NCollection_List::Iterator anExpIterator(anExplodeTypes); - anExpIterator.More(); - anExpIterator.Next()) - { - TopAbs_ShapeEnum aType = anExpIterator.Value(); - QAction* anAction = ViewControl_Tools::CreateAction(TopAbs::ShapeTypeToString(aType), - SLOT(onExplode()), - myMainWindow, - this); - anExplodeMenu->addAction(anAction); - if (anExplodeType == aType) - { - anAction->setCheckable(true); - anAction->setChecked(true); - } - } - QAction* anAction = - ViewControl_Tools::CreateAction("NONE", SLOT(onExplode()), myMainWindow, this); - anExplodeMenu->addSeparator(); - anExplodeMenu->addAction(anAction); - } - } - - QPoint aPoint = myTreeView->mapToGlobal(thePosition); - aMenu->exec(aPoint); -} - -// ======================================================================= -// function : onTreeViewSelectionChanged -// purpose : -// ======================================================================= -void ShapeView_Window::onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&) -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - if (myPropertyPanelWidget->toggleViewAction()->isChecked()) - myPropertyView->Init(ViewControl_Tools::CreateTableModelValues(myTreeView->selectionModel())); - - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onEraseAllPerformed -// purpose : -// ======================================================================= -void ShapeView_Window::onEraseAllPerformed() -{ - ShapeView_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - - // TODO: provide update for only visibility state for better performance TopoDS_Shape - // myCustomShape; - - aTreeModel->Reset(); - aTreeModel->EmitLayoutChanged(); -} - -// ======================================================================= -// function : onExplode -// purpose : -// ======================================================================= -void ShapeView_Window::onExplode() -{ - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - - QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - return; - - ShapeView_ItemShapePtr aShapeItem = itemDynamicCast(anItemBase); - if (!aShapeItem) - return; - - QAction* anAction = (QAction*)sender(); - if (!anAction) - return; - - QApplication::setOverrideCursor(Qt::WaitCursor); - TopAbs_ShapeEnum aShapeType; - if (anAction->text() == "NONE") - aShapeType = TopAbs_SHAPE; - else - aShapeType = TopAbs::ShapeTypeFromString(anAction->text().toStdString().c_str()); - - myViewWindow->Displayer()->EraseAllPresentations(); - aShapeItem->SetExplodeType(aShapeType); - - // anItemBase->Parent()->Reset(); - TODO (update only modified sub-tree) - ShapeView_TreeModel* aTreeModel = dynamic_cast(myTreeView->model()); - aTreeModel->Reset(); - aTreeModel->EmitLayoutChanged(); - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onLoadFile -// purpose : -// ======================================================================= -void ShapeView_Window::onLoadFile() -{ - QString aDataDirName = QDir::currentPath(); - - QString aFileName = ShapeView_OpenFileDialog::OpenFile(0, aDataDirName); - aFileName = QDir().toNativeSeparators(aFileName); - if (aFileName.isEmpty()) - return; - - QApplication::setOverrideCursor(Qt::WaitCursor); - onOpenFile(aFileName); - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onExportToBREP -// purpose : -// ======================================================================= -void ShapeView_Window::onExportToBREP() -{ - QString aFilter(tr("Boundary representation file (*.brep *)")); - QString aSelectedFilter; - QString aFileName = QFileDialog::getSaveFileName(0, - tr("Export shape to file"), - QString(), - aFilter, - &aSelectedFilter); - - QItemSelectionModel* aModel = myTreeView->selectionModel(); - if (!aModel) - return; - - QModelIndexList aSelectedRows = aModel->selectedRows(); - if (aSelectedRows.size() == 0) - return; - - QModelIndex aSelectedIndex = aSelectedRows.at(0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(aSelectedIndex); - if (!anItemBase) - return; - - ShapeView_ItemShapePtr anItem = itemDynamicCast(anItemBase); - if (!anItem) - return; - - TCollection_AsciiString aFileNameIndiced = aFileName.toStdString().c_str(); - const TopoDS_Shape& aShape = anItem->GetItemShape(); - BRepTools::Write(aShape, aFileNameIndiced.ToCString()); - anItem->SetFileName(aFileNameIndiced.ToCString()); - aFileName = aFileNameIndiced.ToCString(); -} diff --git a/tools/ShapeView/ShapeView_Window.hxx b/tools/ShapeView/ShapeView_Window.hxx deleted file mode 100644 index f993102f14..0000000000 --- a/tools/ShapeView/ShapeView_Window.hxx +++ /dev/null @@ -1,160 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ShapeView_Window_H -#define ShapeView_Window_H - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class View_Window; - -class ViewControl_PropertyView; - -class QAction; -class QDockWidget; -class QMainWindow; -class QWidget; - -//! \class ShapeView_Window -//! Window that unites all ShapeView controls. -class ShapeView_Window : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT ShapeView_Window(QWidget* theParent); - - //! Destructor - Standard_EXPORT virtual ~ShapeView_Window(); - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - Standard_EXPORT void SetParent(void* theParent); - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - { - myParameters = theParameters; - } - - //! Provides container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - Standard_EXPORT virtual void FillActionsMenu(void* theMenu); - - //! Returns plugin preferences: dock widgets state, tree view columns. - //! \param theItem container of preference elements - Standard_EXPORT void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies plugin preferences - //! \param theItem container of preference elements - Standard_EXPORT void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies parameters to Init controls, opens files if there are in parameters, updates OCAF tree - //! view model - Standard_EXPORT void UpdateContent(); - - //! Returns main control - QMainWindow* GetMainWindow() const { return myMainWindow; } - - //! Returns current tree view - QTreeView* GetTreeView() const { return myTreeView; } - - //! Removes all shapes in tree view model, remove all stored BREP files - Standard_EXPORT void RemoveAllShapes(); - -protected: - //! Appends shape into tree view model - //! \param theShape a shape instance - Standard_EXPORT void addShape(const TopoDS_Shape& theShape); - -private: - //! Fills controls of the plugin by parameters: - //! - Fine AIS_InteractiveObject and fills View if it if it differs from the current context - //! \param theParameters a parameters container - void Init(NCollection_List& theParameters); - - //! Reads Shape from the file name, add Shape into tree view - //! \param theFileName BREP file name - void OpenFile(const TCollection_AsciiString& theFileName); - -protected slots: - - //! Shows context menu for tree view selected item. It contains expand/collapse actions. - //! \param thePosition a clicked point - void onTreeViewContextMenuRequested(const QPoint& thePosition); - - //! Processes selection in tree view: make presentation or owner selected in the context if - //! corresponding check box is checked \param theSelected a selected items \param theDeselected a - //! deselected items - void onTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Updates visibility states by erase all in context - void onEraseAllPerformed(); - - //! Sets the shape item exploded - void onExplode(); - - //! Removes all shapes in tree view - void onClearView() { RemoveAllShapes(); } - - //! Loads BREP file and updates tree model to have shape of the file - void onLoadFile(); - - //! Views BREP files of selected items if exist - void onExportToBREP(); - - //! Converts file name to Ascii String and perform opening file - //! \param theFileName a file name to be opened - void onOpenFile(const QString& theFileName) - { - OpenFile(TCollection_AsciiString(theFileName.toUtf8().data())); - } - -protected: - //! Creates new action and connect it to the given slot - //! \param theText an action text - //! \param theSlot a listener method - QAction* createAction(const QString& theText, const char* theSlot); - -private: - QMainWindow* myMainWindow; //!< main control, parent for all ShapeView controls - - QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget - ViewControl_PropertyView* - myPropertyView; //!< property control to display model item values if exist - - View_Window* myViewWindow; //!< OCC 3d view to visualize presentations - QTreeView* myTreeView; //!< tree view visualized shapes - - Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container -}; - -#endif diff --git a/tools/ShapeView/icons/folder_import.png b/tools/ShapeView/icons/folder_import.png deleted file mode 100644 index 02743abe9b52fc756a8ae82dc712d0f0ef52060e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~A~99;!8=(DGb zV@O5Z+gW?NWZXqs!}n{SzQLi&C*z@DU=jT6K*9&<2#um`GmVb^6{}-;cwB(v3qw&_ zL3&()nt{gjEqQk@m!6I;e*MMg``laiRz=GGNHDp5$MXB)w6e4YTmSyt{_yYZ^er*mFT7s6$QcNK|9Ahna^}iu7q04= zeR7!m$d3DtP-Vm1M@k^E(9>>g=f%W5y|=cki%~Nw*to+ZYL#lq*S|{5cfcwFSofW1 z*n8CVQjqRKt(t=kwMSiZHiiX=?n_{p{P3VyHf!iZZZ-o+xxp^jQoibtI8UOH&5R`7 z4}KMEfPPU>JM0{^hV|R@_5_K^4;3}Tty7;UN}Nck@Zh@UV_C`3W+W*$X_9HMpIp;I zpEma3EnX#Wiw*{;9d6c*R^C;%GeH9w0@KzC#_o-O5l*8Aqa zxhZvVYvrzg8w+Cpo9auPN~ze8n(cD^+~u$8hwdNh?^a2I8BlHPcu!#tXMW54uj;pz znd2Xvzcqu0e_KxPi&xJrr;Gp8nDfeix$pgvLo_{(}wOlh|`^-m3WcTUd?n&9wFej_5ri+X{T&Ou7E`K4(0~ zeGdL(zjF*abmO?9cZsFV-LtM<<&Ib$$M!Gx&L&8J)K>7Gsk>G7cl#mThtD{;*)|>Z zPCOlN)*bix(97LwG2*YpG+50OuD?0`C|;uC)v=h;#^6uKelMT2@7>jZQZw{eZq&rDOE2HE}NKl;&q+Gbv6sMKDC%%oKT??BircxgfVpD^4I%?3VwZv z`_Ol9wl=`0DgPJk_Z_nUg?%%%Ie&6y|$q2jFSYb^~ zkk3Cpj<#sre*CtX!~vEa6~A+S{J8FaxPJZqzNc~Ae^x6=Yo}=acy%&Pdd7DPZ=w6U zSQ@_r)vB`0y4+?z{jYDu3VuWVFpkr+J_!g~@I)>BA^oz}Pr7?*(&lY8Dz&#B1#_Mb zYIFsPh)#ZH^yKVWoyMj9KxyIN%{D2s4{%%O>VyUCSf5wvp;pj)`PdDpt3OJBcl sI(qF@~ diff --git a/tools/ShapeView/icons/folder_open.png b/tools/ShapeView/icons/folder_open.png deleted file mode 100644 index b0a139ebc65294d49ed5be9612931ffbba86b339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1957 zcmV;W2U_@vP)pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900$vSL_t(oN3EA@Sk!eE$Ju>~1=1dUVLqvwB_f8UtELp2*;;Ao znzt-9BQJ!4gCL2D;NXyAw16|iZ4g8ZE6u#oR*H{+T#}0e!*Cf7Z>mh0W))-#?sTi*1Jy8?}L2*a#cbuu7XeYFl;Vf3#};$@%8($w>BDEt_0wXHdJ_1%JaflLA{BKEc9Eepqnn zWxQ9p5Z*^Tc)X7QP4qBS{;&q3I|ZUG62cq=(HvmIycwc30-{Te>I)wuS^1>Z*crzf z(y;X69H`o&5!JdA5#}(2HU}f6pQrgBa}Zu++Z>OWiB57=7)$%+GVI--%{cqcZ`93m+j( zH5?iHM?<&Ik@VQnSf1p8`T5fk(Hn|wy;~5{6NuoRjhJITs?J7u}8vNR(Ci2faB;$5_7JlhEftAT4u<)`kKK*Y9 z!u}JCwWcLlb?)`M!L0(c(QdqV9R%;lQujJ61_m?C7=W1+!fMpN35)4Hh^CKew}EW5 z!+yEJYid(6sT^dfJ+b}52Uww>haLY5gJ0eRhv4@FbfwYRIyz^WYZ$0z`U8-Kuo|^~ ztO(B=d0oc2c9=l@0-KmFExuNJSp#}<99LGq>2w|21*Ae;^QTjmxcV<-+Cz}f$WTyU zWO4K%OsgR}5^zFm6Ce{)qPY8eU#tS8P6{xsg{XN2;_6iLqLrp|&mox;k{08E^u13& zryBNfVr7Oy_t^-fD4$?Mj=I;JpN&Qu8&tdZDX5jBkRIm=y8zC9BX>acY>28U#K%gC z(gUsfINa_y%*IN^ukG63fZUuq-0u7mzjU8L#ZL+xPMBsF(2)$$z_ML^38Lb8G8yK) zXK?QDtK5h=?D!Z?Nr-JBnKumq+O;UyoV(fZsgVAC4w(nW^9Jr*L5CKieigHx0a5Nv zCPBB?18r4NyvsOtHv7Z$4#$+;-^k@OXyiqK(UXmwe>`gq-ba82qLy=g zg$-Cb0qHUBXscwo+G3gcN;;u~hmPk!aCdNA1>XUp{QwLX1CX6CrN00*gkc4RvgjE&r8diFs%gI}3MyaowvWLrJUZ`wqkI^=xen7v(qE7c`I(!a~jcgOXTP)N;t zSdm3^z%rIiBol@J?aFxthQ*M~F{rx~cwhE?1SF#4{2ZK2oyvaTQmR`=V=koq>1+hm$3;?WUp1c&xDSfPK@^T9V+H}w z%XYGT)dKp9LSx|;WPa|+c+Lduc11V;#{Wk1JhSJPGOmMEHWO0OvyckLk+FlPkhWzr zAl3S_zmjpBzWWEhgNud&4()pi^@Sn4`#4C|D``9%Qt=DKX9!GzRLbC0iy$>I`+}eW zvzKv6+U1JegEZ_t#b!x>RL^;>SxX_S$Ol7UH6#NwH*u6Z4&fX1z}d@Cz~iVb+<|VR z2EB&;xK$m6Tl$^&mwv~PkZo`2BXP4vg}Q<;zJA9rj`QF$E?F#pD*qqQD*6778Nqk| r2ri@FMk-06KXvp-#&90k23-CRXcCO4NhoE%00000NkvXXu0mjfAlJhA diff --git a/tools/TInspector/FILES b/tools/TInspector/FILES deleted file mode 100644 index 471fd38cb1..0000000000 --- a/tools/TInspector/FILES +++ /dev/null @@ -1,17 +0,0 @@ -TInspector.qrc -TInspector_Communicator.cxx -TInspector_Communicator.hxx -TInspector_OpenButton.cxx -TInspector_OpenButton.hxx -TInspector_OpenFileDialog.cxx -TInspector_OpenFileDialog.hxx -TInspector_OpenFileViewModel.cxx -TInspector_OpenFileViewModel.hxx -TInspector_PluginParameters.cxx -TInspector_PluginParameters.hxx -TInspector_Preferences.cxx -TInspector_Preferences.hxx -TInspector_Shortcut.cxx -TInspector_Shortcut.hxx -TInspector_Window.cxx -TInspector_Window.hxx diff --git a/tools/TInspector/TInspector.qrc b/tools/TInspector/TInspector.qrc deleted file mode 100644 index 439185f9fc..0000000000 --- a/tools/TInspector/TInspector.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - icons/folder_open.png - icons/folder_import.png - icons/plugin_actions.png - - diff --git a/tools/TInspector/TInspector_Communicator.cxx b/tools/TInspector/TInspector_Communicator.cxx deleted file mode 100644 index 39d8e5961b..0000000000 --- a/tools/TInspector/TInspector_Communicator.cxx +++ /dev/null @@ -1,117 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TInspector_Communicator::TInspector_Communicator() -{ - if (!qApp) - { - static int argc = 1; - static char* argv[] = {(char*)"", 0}; -#if QT_VERSION > 0x050000 - TCollection_AsciiString aPlugindsDirName; - if (TInspector_Communicator::PluginsDir(aPlugindsDirName)) - QApplication::addLibraryPath(aPlugindsDirName.ToCString()); -#endif - new QApplication(argc, argv); - } - myWindow = new TInspector_Window(); -} - -// ======================================================================= -// function : PluginsDir -// purpose : -// ======================================================================= -Standard_Boolean TInspector_Communicator::PluginsDir(TCollection_AsciiString& thePlugindsDirName) -{ - OSD_Environment anEnvironment("QTDIR"); - TCollection_AsciiString aQtDirValue = anEnvironment.Value(); - if (!aQtDirValue.IsEmpty()) - { - thePlugindsDirName = aQtDirValue + "/plugins"; - return Standard_True; - } - anEnvironment = OSD_Environment("PATH"); - TCollection_AsciiString aPathValue = anEnvironment.Value(); - TCollection_AsciiString aPathSep = -#ifdef _WIN32 - ';'; -#else - ':'; -#endif - while (!aPathValue.IsEmpty()) - { - Standard_Integer aSepIndex = aPathValue.FirstLocationInSet(aPathSep, 1, aPathValue.Length()); - if (aSepIndex <= 1) - break; - - TCollection_AsciiString aCurPath = aPathValue.SubString(1, aSepIndex - 1); - aPathValue = aSepIndex < aPathValue.Length() - ? aPathValue.SubString(aSepIndex + 1, aPathValue.Length()) - : ""; - if (aCurPath.IsEmpty()) - continue; - - aCurPath += "/../plugins"; - OSD_Path aPath(aCurPath); - OSD_Directory aCurDir(aPath); - if (aCurDir.Exists()) - { - thePlugindsDirName = aCurPath; - return Standard_True; - } - } - return Standard_False; -} - -// ======================================================================= -// function : SetVisible -// purpose : -// ======================================================================= -void TInspector_Communicator::SetVisible(const bool theVisible) -{ - myWindow->GetMainWindow()->setVisible(theVisible); -#ifndef _WIN32 - // window is not visualized on X11 patform under DRAW tool without the next row - QApplication::processEvents(); -#endif -} - -// ======================================================================= -// function : Move -// purpose : -// ======================================================================= -void TInspector_Communicator::Move(const int theXPosition, const int theYPosition) -{ - myWindow->GetMainWindow()->move(theXPosition, theYPosition); -} diff --git a/tools/TInspector/TInspector_Communicator.hxx b/tools/TInspector/TInspector_Communicator.hxx deleted file mode 100644 index 18d298df91..0000000000 --- a/tools/TInspector/TInspector_Communicator.hxx +++ /dev/null @@ -1,150 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspector_Communicator_H -#define TInspector_Communicator_H - -#include -#include - -#include -#include -#include -#include - -class QPushButton; - -//! \class TInspector_Communicator. -//! \brief This is a connector from TInspector window to: -//! - register tool plugin -//! - give parameters into plugin -class TInspector_Communicator -{ -public: - //! Constructor - Standard_EXPORT TInspector_Communicator(); - - //! Destructor - virtual ~TInspector_Communicator() {} - - //! Returns directory of Qt plugins. Firstly it founds it in QTDIR, else if not defined in PATH - Standard_EXPORT static Standard_Boolean PluginsDir(TCollection_AsciiString& thePlugindsDirName); - - //! Registers plugin into TInspector window - //! \param thePluginName a name of the plugin - void RegisterPlugin(const TCollection_AsciiString& thePluginName) - { - myWindow->RegisterPlugin(thePluginName); - } - - //! Returns list of registered plugins - //! \return container of plugin names - NCollection_List RegisteredPlugins() const - { - return myWindow->RegisteredPlugins(); - } - - //! Stores parameters for the plugin - //! \param theParameters container of parameters(e.g. AIS_InteractiveContext, TDocStd_Application) - //! \param theAppend boolean state whether the parameters should be added to existing - void Init(const NCollection_List& theParameters, - const Standard_Boolean theAppend = Standard_False) - { - myWindow->Init("", theParameters, theAppend); - } - - //! Stores parameters for the plugin - //! \param thePluginName a name of the plugin - //! \param theParameters container of parameters(e.g. AIS_InteractiveContext, TDocStd_Application) - //! \param theAppend boolean state whether the parameters should be added to existing - void Init(const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean theAppend = Standard_False) - { - myWindow->Init(thePluginName, theParameters, theAppend); - } - - //! Updates content for the TInspector window - void UpdateContent() { myWindow->UpdateContent(); } - - //! Sets open button for the TInspector window - void SetOpenButton(QPushButton* theButton) { myWindow->SetOpenButton(theButton); } - - //! Opens file in TInspector window - void OpenFile(const TCollection_AsciiString& thePluginName, - const TCollection_AsciiString& theFileName) - { - myWindow->OpenFile(thePluginName, theFileName); - } - - //! Activates plugin - //! \param thePluginName a name of the plugin - void Activate(const TCollection_AsciiString& thePluginName) - { - myWindow->ActivateTool(thePluginName); - } - - //! Sets item selected in the active plugin - //! \param theItemName a container of name of items in plugin that should become selected - void SetSelected(const NCollection_List& theItemNames) - { - myWindow->SetSelected(theItemNames); - } - - //! Sets objects to be selected in the plugin - //! \param theObjects an objects - void SetSelected(const NCollection_List& theObjects) - { - myWindow->SetSelected(theObjects); - } - - //! Sets path to a directory for temporary plugin files - //! \param thePath a path - void SetTemporaryDirectory(const TCollection_AsciiString& thePath) - { - myWindow->SetTemporaryDirectory(thePath); - } - - //! Returns path to a directory for temporary plugin files - //! \return path - TCollection_AsciiString GetTemporaryDirectory() const - { - return myWindow->GetTemporaryDirectory(); - } - - //! Changes window visibility - //! \param theVisible boolean state - Standard_EXPORT virtual void SetVisible(const bool theVisible); - - //! Changes window position - //! \param theX X pixel position of top left corner of the window - //! \param theY Y pixel position - Standard_EXPORT virtual void Move(const int theXPosition, const int theYPosition); - - //! Puts in the stream information about communicator - //! \param theStream stream for output - void Dump(Standard_OStream& theStream) const { return myWindow->Dump(theStream); } - - //! Returns plugins parameters container - Handle(TInspectorAPI_PluginParameters) const GetPluginParameters() - { - return myWindow->GetPluginParameters(); - } - -private: - TInspector_Window* myWindow; //!< current window -}; - -#endif diff --git a/tools/TInspector/TInspector_OpenButton.cxx b/tools/TInspector/TInspector_OpenButton.cxx deleted file mode 100644 index cd8ea57637..0000000000 --- a/tools/TInspector/TInspector_OpenButton.cxx +++ /dev/null @@ -1,102 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include -#include -#include - -const int RECENT_FILES_CACHE_SIZE = 10; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TInspector_OpenButton::TInspector_OpenButton(QObject* theParent) - : QObject(theParent), - myStartButton(0) -{ -} - -// ======================================================================= -// function : StartButton -// purpose : -// ======================================================================= -QPushButton* TInspector_OpenButton::StartButton() -{ - if (!myStartButton) - { - myStartButton = new QPushButton(); - myStartButton->setIcon(QIcon(":folder_open.png")); - connect(myStartButton, SIGNAL(clicked()), this, SLOT(onStartButtonClicked())); - } - return myStartButton; -} - -// ======================================================================= -// function : onStartButtonClicked -// purpose : -// ======================================================================= -void TInspector_OpenButton::onStartButtonClicked() -{ - QPushButton* aButton = (QPushButton*)sender(); - TCollection_AsciiString aPluginName(aButton->objectName().toStdString().c_str()); - if (aPluginName.IsEmpty()) - return; - - QStringList aPluginRecentlyOpenedFiles; - if (myRecentlyOpenedFiles.contains(aPluginName)) - { - QStringList aFileNames = myRecentlyOpenedFiles[aPluginName]; - for (int i = 0; i < aFileNames.size(); i++) - { - QFileInfo aFileInfo(aFileNames[i]); - if (aFileInfo.exists() && aFileInfo.isFile()) - aPluginRecentlyOpenedFiles.append(aFileInfo.absoluteFilePath()); - } - } - - QString aFileName = TInspector_OpenFileDialog::OpenFile(0, aPluginRecentlyOpenedFiles); - aFileName = QDir().toNativeSeparators(aFileName); - if (!aFileName.isEmpty()) - { - QApplication::setOverrideCursor(Qt::WaitCursor); - TInspector_OpenFileDialog::Communicator()->OpenFile( - aPluginName, - TCollection_AsciiString(aFileName.toUtf8().data())); - - QFileInfo aFileInfo(aFileName); - if (!aPluginRecentlyOpenedFiles.contains(aFileInfo.absoluteFilePath())) - { - myRecentlyOpenedFiles[aPluginName].append(aFileInfo.absoluteFilePath()); - for (int i = 0; i < myRecentlyOpenedFiles[aPluginName].size() - RECENT_FILES_CACHE_SIZE; i++) - myRecentlyOpenedFiles[aPluginName].removeFirst(); - TInspector_OpenFileDialog::SetPluginRecentlyOpenedFiles( - aPluginName, - TInspector_OpenFileDialog::Communicator(), - myRecentlyOpenedFiles[aPluginName]); - - TInspector_OpenFileDialog::Communicator()->GetPluginParameters()->StorePreferences(); - } - - QApplication::restoreOverrideCursor(); - } -} diff --git a/tools/TInspector/TInspector_OpenButton.hxx b/tools/TInspector/TInspector_OpenButton.hxx deleted file mode 100644 index c415735001..0000000000 --- a/tools/TInspector/TInspector_OpenButton.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspectorEXE_OpenButton_H -#define TInspectorEXE_OpenButton_H - -#include - -#include -#include -#include -#include -#include - -class QPushButton; - -//! \class TInspector_OpenButton -//! Class that contains push button and the button processing. It obtains a file name from the -//! default or current directory and gives the name into TInspector communicator Object name of the -//! button is the name of the plugin to get the default directory, or the current directory is used. -class TInspector_OpenButton : public QObject -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT TInspector_OpenButton(QObject* theParent); - - //! Destructor - virtual ~TInspector_OpenButton() {} - - //! Returns the start button, if this is the first call, it creates the button and connect it to - //! the slot - Standard_EXPORT QPushButton* StartButton(); - - //! Sets the default directory of plugin. - void SetPluginRecentlyOpenedFiles(const TCollection_AsciiString& thePluginName, - const QStringList& theRecentlyOpenedFiles) - { - myRecentlyOpenedFiles[thePluginName] = theRecentlyOpenedFiles; - } - -private slots: - - //! Processes the button click, open default/current directory to select open file, calls OpenFile - //! of communicator - void onStartButtonClicked(); - -private: - QPushButton* myStartButton; //!< processed button - //!< plugins recently opened files - QMap myRecentlyOpenedFiles; -}; - -#endif diff --git a/tools/TInspector/TInspector_OpenFileDialog.cxx b/tools/TInspector/TInspector_OpenFileDialog.cxx deleted file mode 100644 index fbd88ed567..0000000000 --- a/tools/TInspector/TInspector_OpenFileDialog.cxx +++ /dev/null @@ -1,292 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const int ICON_SIZE = 40; - -static const int OPEN_DIALOG_WIDTH = 550; -static const int OPEN_DIALOG_HEIGHT = 200; - -static const int MARGIN_DIALOG = 4; -static const int SPACING_DIALOG = 2; - -static const int RECENT_FILES_CACHE_SIZE = 10; - -TInspector_Communicator* MyCommunicator; - -// ======================================================================= -// function : changeMargins -// purpose : -// ======================================================================= -void changeMargins(QBoxLayout* theLayout) -{ - theLayout->setContentsMargins(MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG); - theLayout->setSpacing(SPACING_DIALOG); -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TInspector_OpenFileDialog::TInspector_OpenFileDialog(QWidget* theParent, - const QStringList& theRecentlyOpenedFiles) - : QDialog(theParent), - myRecentlyOpenedFiles(theRecentlyOpenedFiles) -{ - setWindowTitle(tr("Open File")); - - QVBoxLayout* aDialogLay = new QVBoxLayout(this); - changeMargins(aDialogLay); - - // Samples View - QGroupBox* aSamplesBox = new QGroupBox(this); - aSamplesBox->setTitle(tr("Recent files")); - aDialogLay->addWidget(aSamplesBox); - QVBoxLayout* aSampleLay = new QVBoxLayout(aSamplesBox); - changeMargins(aSampleLay); - mySamplesView = createTableView(theRecentlyOpenedFiles); - aSampleLay->addWidget(mySamplesView); - - // Select file - QGroupBox* aSelectFileBox = new QGroupBox(this); - aSelectFileBox->setTitle(tr("Select file")); - aDialogLay->addWidget(aSelectFileBox); - QGridLayout* aSelectFileLay = new QGridLayout(aSelectFileBox); - aSelectFileLay->setContentsMargins(MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG); - - mySelectedName = new QLineEdit(aSelectFileBox); - QCompleter* aCompleter = new QCompleter(); - QFileSystemModel* aFileSystemModel = new QFileSystemModel; - aFileSystemModel->setRootPath(QDir::rootPath()); - aCompleter->setModel(aFileSystemModel); - mySelectedName->setCompleter(aCompleter); - aSelectFileLay->addWidget(mySelectedName, 1, 0); - - QToolButton* aSelectFileBtn = new QToolButton(aSelectFileBox); - aSelectFileBtn->setIcon(QIcon(":folder_open.png")); - aSelectFileLay->addWidget(aSelectFileBtn, 1, 1); - - connect(aSelectFileBtn, SIGNAL(clicked()), this, SLOT(onSelectClicked())); - connect(mySelectedName, SIGNAL(returnPressed()), this, SLOT(onApplySelectClicked())); - - resize(OPEN_DIALOG_WIDTH, OPEN_DIALOG_HEIGHT); -} - -// ======================================================================= -// function : OpenFile -// purpose : -// ======================================================================= -QString TInspector_OpenFileDialog::OpenFile(QWidget* theParent, - const QStringList& theRecentlyOpenedFiles) -{ - QString aFileName; - TInspector_OpenFileDialog* aDialog = - new TInspector_OpenFileDialog(theParent, theRecentlyOpenedFiles); - if (aDialog->exec() == QDialog::Accepted) - aFileName = aDialog->GetFileName(); - - return aFileName; -} - -// ======================================================================= -// function : Communicator -// purpose : -// ======================================================================= -TInspector_Communicator* TInspector_OpenFileDialog::Communicator() -{ - if (!MyCommunicator) - MyCommunicator = new TInspector_Communicator(); - return MyCommunicator; -} - -// ======================================================================= -// function : GetPluginRecentlyOpenedFiles -// purpose : -// ======================================================================= -void TInspector_OpenFileDialog::GetPluginRecentlyOpenedFiles( - const TCollection_AsciiString& thePluginName, - TInspector_Communicator* theCommunicator, - QStringList& theFileNames) -{ - Handle(TInspectorAPI_PluginParameters) aParameters = theCommunicator->GetPluginParameters(); - TInspectorAPI_PreferencesDataMap aPreferencesItem; - aParameters->GetPreferences(thePluginName, aPreferencesItem); - - for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt(aPreferencesItem); anItemIt.More(); - anItemIt.Next()) - { - if (!anItemIt.Key().IsEqual("recently_opened_files")) - continue; -#include - theFileNames = QString(anItemIt.Value().ToCString()).split(";", QString::SkipEmptyParts); -#include - if (theFileNames.size() > RECENT_FILES_CACHE_SIZE) - for (int i = 0; i < theFileNames.size() - RECENT_FILES_CACHE_SIZE; i++) - theFileNames.removeFirst(); - break; - } -} - -// ======================================================================= -// function : SetPluginRecentlyOpenedFiles -// purpose : -// ======================================================================= -void TInspector_OpenFileDialog::SetPluginRecentlyOpenedFiles( - const TCollection_AsciiString& thePluginName, - TInspector_Communicator* theCommunicator, - QStringList& theFileNames) -{ - Handle(TInspectorAPI_PluginParameters) aParameters = theCommunicator->GetPluginParameters(); - - TInspectorAPI_PreferencesDataMap aPreferencesItem; - aParameters->GetPreferences(thePluginName, aPreferencesItem); - aPreferencesItem.Bind("recently_opened_files", - TCollection_AsciiString(theFileNames.join(";").toUtf8().data())); - - aParameters->SetPreferences(thePluginName, aPreferencesItem); -} - -// ======================================================================= -// function : onSampleSelectionChanged -// purpose : -// ======================================================================= -void TInspector_OpenFileDialog::onSampleSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - QItemSelectionModel* aSelectionModel = (QItemSelectionModel*)sender(); - if (!aSelectionModel) - return; - if (theSelected.isEmpty()) - return; - - QModelIndex anIndex = theSelected.first().indexes().first(); - if (!anIndex.isValid()) - return; - - myFileName = aSelectionModel->model()->data(anIndex, Qt::ToolTipRole).toString(); - accept(); -} - -// ======================================================================= -// function : onSelectClicked -// purpose : -// ======================================================================= -void TInspector_OpenFileDialog::onSelectClicked() -{ - QString anEnteredPath; - QString aDirName = mySelectedName->text(); - if (!aDirName.isEmpty()) - { - QDir aDir(aDirName); - if (aDir.exists()) - anEnteredPath = aDirName; - } - - QString aFileName = QFileDialog::getOpenFileName(0, "Open document", anEnteredPath); - - if (aFileName.isEmpty()) - return; // do nothing, left the previous value - - myFileName = aFileName; - accept(); -} - -// ======================================================================= -// function : onApplySelectClicked -// purpose : -// ======================================================================= -void TInspector_OpenFileDialog::onApplySelectClicked() -{ - QString aFileName = mySelectedName->text(); - - QFileInfo aFileInfo(aFileName); - if (!aFileInfo.exists() || !aFileInfo.isFile()) - return; - - myFileName = mySelectedName->text(); - accept(); -} - -// ======================================================================= -// function : createTableView -// purpose : -// ======================================================================= -QTableView* TInspector_OpenFileDialog::createTableView(const QStringList& theFileNames) -{ - QTableView* aTableView = new QTableView(this); - aTableView->setFrameStyle(QFrame::NoFrame); - QPalette aPalette = aTableView->viewport()->palette(); - QColor aWindowColor = aPalette.color(QPalette::Window); - aPalette.setBrush(QPalette::Base, aWindowColor); - aTableView->viewport()->setPalette(aPalette); - - aTableView->horizontalHeader()->setVisible(false); - aTableView->verticalHeader()->setVisible(false); - aTableView->setGridStyle(Qt::NoPen); - aTableView->setModel(createModel(theFileNames)); - aTableView->setItemDelegateForRow( - 0, - new TInspectorEXE_OpenFileItemDelegate(aTableView, aPalette.color(QPalette::Highlight))); - aTableView->viewport()->setAttribute(Qt::WA_Hover); - int aCellHeight = ICON_SIZE + aTableView->verticalHeader()->defaultSectionSize(); - aTableView->setRowHeight(0, aCellHeight); - int aScrollHeight = aTableView->horizontalScrollBar()->sizeHint().height(); - aTableView->setMinimumHeight(aCellHeight + aScrollHeight); - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(aTableView->model()); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onSampleSelectionChanged(const QItemSelection&, const QItemSelection&))); - aTableView->setSelectionModel(aSelectionModel); - - return aTableView; -} - -// ======================================================================= -// function : createModel -// purpose : -// ======================================================================= -QAbstractItemModel* TInspector_OpenFileDialog::createModel(const QStringList& theFileNames) -{ - TInspector_OpenFileViewModel* aModel = new TInspector_OpenFileViewModel(this); - aModel->Init(theFileNames); - return aModel; -} diff --git a/tools/TInspector/TInspector_OpenFileDialog.hxx b/tools/TInspector/TInspector_OpenFileDialog.hxx deleted file mode 100644 index a2dda2a0bd..0000000000 --- a/tools/TInspector/TInspector_OpenFileDialog.hxx +++ /dev/null @@ -1,119 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspectorEXE_OpenFileDialog_H -#define TInspectorEXE_OpenFileDialog_H - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -class TInspector_Communicator; - -class QAbstractItemModel; -class QLineEdit; -class QPushButton; -class QTableView; -class QToolButton; -class QWidget; - -//! \class TInspector_OpenFileDialog -//! Control that contains table view of samples and line to select a file name from other directory. -//! Click on element of samples table view calls this sample opening else after entering(or opening) -//! file name the import becomes active. Click on the button will open selected file if it is -//! possible -class TInspector_OpenFileDialog : public QDialog -{ - Q_OBJECT -private: - //! Constructor - Standard_EXPORT TInspector_OpenFileDialog(QWidget* theParent, - const QStringList& theRecentlyOpenedFiles); - -public: - //! Destructor - virtual ~TInspector_OpenFileDialog() Standard_OVERRIDE {} - - //! Opens this file dialog using for samples view the given directory and try to open new file - //! \param theParent a parent for the new dialog - //! \param theDataDirName path to default samples directory - //! \returns a file name from the open file dialog - Standard_EXPORT static QString OpenFile(QWidget* theParent, - const QStringList& theRecentlyOpenedFiles); - - //! Returns selection name from the dialog - QString GetFileName() const { return myFileName; } - - //! Returns communicator, if this is the first call, create a communicator instance - Standard_EXPORT static TInspector_Communicator* Communicator(); - - //! Returns preferences: previous opened documents. - //! \param thePluginName name of the plugin - //! \param theCommunicator source of preferences - //! \param[out] theFileNames container of recently opened file names - Standard_EXPORT static void GetPluginRecentlyOpenedFiles( - const TCollection_AsciiString& thePluginName, - TInspector_Communicator* theCommunicator, - QStringList& theFileNames); - - //! Sets preferences: previous opened documents. - //! \param thePluginName name of the plugin - //! \param theCommunicator source of preferences - //! \param theFileNames container of recently opened file names to be set into communicator - //! preferences - Standard_EXPORT static void SetPluginRecentlyOpenedFiles( - const TCollection_AsciiString& thePluginName, - TInspector_Communicator* theCommunicator, - QStringList& theFileNames); - -private slots: - - //! Stores name of selected sample file - void onSampleSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Opens file dialog to select a file name. Fills file name line, enable import button - void onSelectClicked(); - - //! Accepts open file dialog - void onApplySelectClicked(); - -private: - //! Creates view of file names in samples directory - //! \param theFileNames a container of names - //! \return table view - QTableView* createTableView(const QStringList& theFileNames); - - //! Creates view model and fills it by the file names - //! \param theFileNames a container of names - //! \return model - QAbstractItemModel* createModel(const QStringList& theFileNames); - -private: - QStringList myRecentlyOpenedFiles; //!< recently opened files - QString myFileName; //!< result file name - QTableView* mySamplesView; //!< view of sample file names - QLineEdit* mySelectedName; //!< alternative control to open file -}; - -#endif diff --git a/tools/TInspector/TInspector_OpenFileViewModel.cxx b/tools/TInspector/TInspector_OpenFileViewModel.cxx deleted file mode 100644 index d587eb762c..0000000000 --- a/tools/TInspector/TInspector_OpenFileViewModel.cxx +++ /dev/null @@ -1,80 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include - -const int ICON_SIZE = 40; - -// ======================================================================= -// function : paint -// purpose : -// ======================================================================= -void TInspectorEXE_OpenFileItemDelegate::paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const -{ - // highlight cell - if (theOption.state & QStyle::State_MouseOver) - thePainter->fillRect(theOption.rect, myColor); - - // action icon for all indices before the last one - QIcon anIcon(":folder_import.png"); - QSize anIconSize(ICON_SIZE, ICON_SIZE); - int aDX = (theOption.rect.width() - anIconSize.width()) / 2; - int aMargin = qApp->style()->pixelMetric(QStyle::PM_HeaderMargin); - thePainter->drawPixmap(QRect(theOption.rect.left() + aDX, - theOption.rect.top() + aMargin, - anIconSize.width(), - anIconSize.height()), - anIcon.pixmap(anIconSize.width(), anIconSize.height())); - // default paint - QItemDelegate::paint(thePainter, theOption, theIndex); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void TInspector_OpenFileViewModel::Init(const QStringList& theValues) -{ - myValues = theValues; -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant TInspector_OpenFileViewModel::data(const QModelIndex& theIndex, int theRole) const -{ - switch (theRole) - { - case Qt::DisplayRole: - return QFileInfo(myValues[theIndex.column()]).fileName(); - case Qt::ToolTipRole: - return myValues[theIndex.column()]; - case Qt::TextAlignmentRole: - return QVariant(Qt::AlignBottom | Qt::AlignHCenter); - default: - break; - } - return QVariant(); -} diff --git a/tools/TInspector/TInspector_OpenFileViewModel.hxx b/tools/TInspector/TInspector_OpenFileViewModel.hxx deleted file mode 100644 index d478643697..0000000000 --- a/tools/TInspector/TInspector_OpenFileViewModel.hxx +++ /dev/null @@ -1,107 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspectorEXE_OpenFileViewModel_H -#define TInspectorEXE_OpenFileViewModel_H - -#include - -#include -#include -#include -#include -#include - -class QObject; -class QPainter; - -//! \class TInspectorEXE_OpenFileItemDelegate -//! Draws large(40x40) icons in cell. The icon background in colored in highlight when mouse is over -//! button -class TInspectorEXE_OpenFileItemDelegate : public QItemDelegate -{ - -public: - //! Constructor - TInspectorEXE_OpenFileItemDelegate(QObject* theParent, const QColor& theHighlightColor) - : QItemDelegate(theParent), - myColor(theHighlightColor) - { - } - - //! Destructor - virtual ~TInspectorEXE_OpenFileItemDelegate() {} - - //! Draws an icon in the cell - //! \param thePainter a painter - //! \param theOption a paint options - //! \param theIndex a view index - virtual void paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const Standard_OVERRIDE; - -private: - QColor myColor; //!< highlight color -}; - -//! \class TInspector_OpenFileViewModel -//! Table model that visualizes container of string values (file names) -//! Table orientation is horizontal, it has 1 row, number of columns equals to number of values -class TInspector_OpenFileViewModel : public QAbstractTableModel -{ - -public: - //! Constructor - TInspector_OpenFileViewModel(QObject* theParent = 0) - : QAbstractTableModel(theParent) - { - } - - //! Destructor - virtual ~TInspector_OpenFileViewModel() {} - - //! Store values - //! \param theValues a container of values to fill model - void Init(const QStringList& theValues); - - //! Returns content of the model index for the given role, it is obtained from internal container - //! of values It returns value only for DisplayRole. \param theIndex a model index \param theRole - //! a view role \return value interpreted depending on the given role - virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns number of rows - //! \param theParent an index of the parent item - //! \return an integer value - virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 1; - } - - //! Returns number of columns - //! \param theParent an index of the parent item - //! \return an integer value - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return myValues.size(); - } - -private: - QStringList myValues; //!< file names -}; - -#endif diff --git a/tools/TInspector/TInspector_PluginParameters.cxx b/tools/TInspector/TInspector_PluginParameters.cxx deleted file mode 100644 index 8cf12c2013..0000000000 --- a/tools/TInspector/TInspector_PluginParameters.cxx +++ /dev/null @@ -1,58 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TInspector_PluginParameters::TInspector_PluginParameters(TInspector_Window* theWindow) - : myWindow(theWindow), - myPreferences(new TInspector_Preferences()) -{ - myPreferences->SetDirectory(GetTemporaryDirectory()); -} - -// ======================================================================= -// function : SetParameters -// purpose : -// ======================================================================= -void TInspector_PluginParameters::SetParameters( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean& theToActivatePlugin) -{ - TInspectorAPI_PluginParameters::SetParameters(thePluginName, theParameters, Standard_False); - - if (!theToActivatePlugin) - return; - - SetSelected(thePluginName, theParameters); - myWindow->ActivateTool(thePluginName); -} - -// ======================================================================= -// function : SetTemporaryDirectory -// purpose : -// ======================================================================= -void TInspector_PluginParameters::SetTemporaryDirectory(const TCollection_AsciiString& thePath) -{ - if (thePath.IsEqual(myPreferences->GetDirectory())) - return; - - myPreferences->SetDirectory(thePath); -} diff --git a/tools/TInspector/TInspector_PluginParameters.hxx b/tools/TInspector/TInspector_PluginParameters.hxx deleted file mode 100644 index eb93db3ee9..0000000000 --- a/tools/TInspector/TInspector_PluginParameters.hxx +++ /dev/null @@ -1,79 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef DFBrowser_Communicator_H -#define DFBrowser_Communicator_H - -#include -#include - -#include -#include -#include - -//! \class TInspector_PluginParameters. -//! \brief This is plugin parameters extended by a possibility to activate module during setting new -//! parameters -class TInspector_PluginParameters : public TInspectorAPI_PluginParameters -{ -public: - //! Constructor - Standard_EXPORT TInspector_PluginParameters(TInspector_Window* theWindow); - - //! Destructor - virtual ~TInspector_PluginParameters() {} - - //! Stores the parameters for plugin - //! \param thePluginName a plugin name - //! \param theParameters a list of parameters - //! \param theToActivatePlugin a state whether the plugin should be immediately activated - Standard_EXPORT virtual void SetParameters( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean& theToActivatePlugin = Standard_False) Standard_OVERRIDE; - - //! Sets path to a directory for temporary plugin files. Sets the directory into preferences - //! loader \param thePath a path - virtual void SetTemporaryDirectory(const TCollection_AsciiString& thePath) Standard_OVERRIDE; - - //! Returns plugin preferences - //! \param thePluginName a plugin name - virtual void GetPreferences(const TCollection_AsciiString& thePluginName, - TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myPreferences->GetPreferences(thePluginName, theItem); - } - - //! Stores plugin preferences - //! \param thePluginName a plugin name - //! \theItem container of plugin preferences values in form: - virtual void SetPreferences(const TCollection_AsciiString& thePluginName, - const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myPreferences->SetPreferences(thePluginName, theItem); - } - - //! Stores plugin preferences into a preferences file - virtual void StorePreferences() Standard_OVERRIDE { myPreferences->StorePreferences(); } - - //! Removes plugin preferences file - void RemovePreferences() { myPreferences->RemovePreferences(); } - -private: - TInspector_Window* myWindow; //!< the current window - TInspector_Preferences* myPreferences; //!< the preferences loader -}; - -#endif diff --git a/tools/TInspector/TInspector_Preferences.cxx b/tools/TInspector/TInspector_Preferences.cxx deleted file mode 100644 index a0dfa22de1..0000000000 --- a/tools/TInspector/TInspector_Preferences.cxx +++ /dev/null @@ -1,172 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : GetPreferences -// purpose : -// ======================================================================= -void TInspector_Preferences::GetPreferences(const TCollection_AsciiString& thePluginName, - TInspectorAPI_PreferencesDataMap& theItem) -{ - if (!myIsLoadedPreferences) - { - loadPreferences(); - myIsLoadedPreferences = Standard_True; - } - myLoadedPreferences.Find(thePluginName, theItem); -} - -// ======================================================================= -// function : StorePreferences -// purpose : -// ======================================================================= -void TInspector_Preferences::StorePreferences() -{ - if (myLoadedPreferences.IsEmpty()) - return; - - QString aFileName = - QString(GetDirectory().ToCString()) + QDir::separator() + PreferencesFileName(); - QFile aFile(aFileName); - if (!aFile.open(QFile::WriteOnly)) - return; - - QDomDocument aDomDocument(documentKey()); - QDomComment aComment = - aDomDocument.createComment("\nThis file is automatically created by TInspector " - "application.\nChanges made in this file can be lost.\n"); - aDomDocument.appendChild(aComment); - QDomElement aRootElement = aDomDocument.createElement(documentKey()); - aDomDocument.appendChild(aRootElement); - - for (NCollection_DataMap::Iterator - aPrefsIt(myLoadedPreferences); - aPrefsIt.More(); - aPrefsIt.Next()) - { - QDomElement aPluginElement = aDomDocument.createElement(pluginKey()); - aPluginElement.setAttribute(nameKey(), aPrefsIt.Key().ToCString()); - aRootElement.appendChild(aPluginElement); - - const TInspectorAPI_PreferencesDataMap& aPluginMap = aPrefsIt.Value(); - for (TInspectorAPI_IteratorOfPreferencesDataMap aPluginPrefsIt(aPluginMap); - aPluginPrefsIt.More(); - aPluginPrefsIt.Next()) - { - QDomElement aParameterElement = aDomDocument.createElement(parameterKey()); - aParameterElement.setAttribute(nameKey(), aPluginPrefsIt.Key().ToCString()); - aParameterElement.setAttribute(valueKey(), aPluginPrefsIt.Value().ToCString()); - aPluginElement.appendChild(aParameterElement); - } - } - - QTextStream aTextStream(&aFile); - QStringList aDocumentStr = aDomDocument.toString().split("\n"); - for (QStringList::ConstIterator aContentIt = aDocumentStr.begin(); - aContentIt != aDocumentStr.end(); - ++aContentIt) - { - aTextStream << *aContentIt << '\n'; - } - aFile.close(); -} - -// ======================================================================= -// function : RemovePreferences -// purpose : -// ======================================================================= -void TInspector_Preferences::RemovePreferences() -{ - QString aFileName = - QString(GetDirectory().ToCString()) + QDir::separator() + PreferencesFileName(); - QDir aDir(GetDirectory().ToCString()); - if (aDir.exists(aFileName)) - aDir.remove(aFileName); - reset(); -} - -// ======================================================================= -// function : loadPreferences -// purpose : -// ======================================================================= -void TInspector_Preferences::loadPreferences() -{ - QString aFileName = - QString(GetDirectory().ToCString()) + QDir::separator() + PreferencesFileName(); - QFile aFile(aFileName); - if (!aFile.open(QFile::ReadOnly)) - return; - - QDomDocument aDomDocument; - bool aResult = aDomDocument.setContent(&aFile); - aFile.close(); - if (!aResult) - return; - - QDomElement aRootElement = aDomDocument.documentElement(); - if (aRootElement.isNull() || aRootElement.tagName() != documentKey()) - return; - - QDomNode aPluginNode = aRootElement.firstChild(); - while (!aPluginNode.isNull()) - { - if (aPluginNode.isElement()) - { - QDomElement aPluginElement = aPluginNode.toElement(); - if (aPluginElement.tagName() == pluginKey() && aPluginElement.hasAttribute(nameKey())) - { - TInspectorAPI_PreferencesDataMap anItem; - readPluginItem(aPluginElement, anItem); - myLoadedPreferences.Bind(aPluginElement.attribute(nameKey()).toStdString().c_str(), anItem); - } - } - aPluginNode = aPluginNode.nextSibling(); - } -} - -// ======================================================================= -// function : readPluginItem -// purpose : -// ======================================================================= -void TInspector_Preferences::readPluginItem(const QDomElement thePluginElement, - TInspectorAPI_PreferencesDataMap& theItem) -{ - QDomNode aParameterNode = thePluginElement.firstChild(); - while (!aParameterNode.isNull()) - { - if (aParameterNode.isElement()) - { - QDomElement aParameterElement = aParameterNode.toElement(); - if (aParameterElement.tagName() == parameterKey() && aParameterElement.hasAttribute(nameKey()) - && aParameterElement.hasAttribute(valueKey())) - { - theItem.Bind(aParameterElement.attribute(nameKey()).toStdString().c_str(), - aParameterElement.attribute(valueKey()).toStdString().c_str()); - } - } - aParameterNode = aParameterNode.nextSibling(); - } -} diff --git a/tools/TInspector/TInspector_Preferences.hxx b/tools/TInspector/TInspector_Preferences.hxx deleted file mode 100644 index 2649b59fd5..0000000000 --- a/tools/TInspector/TInspector_Preferences.hxx +++ /dev/null @@ -1,113 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspector_Preferences_H -#define TInspector_Preferences_H - -#include -#include - -#include -#include -#include - -//! The class to read/write custom plugin preferences in XML format. -//! The preferences file is intended to know about: -//! - dock window placement -//! - tree view columns: visibility, width -class TInspector_Preferences -{ -public: - //! Constructs the communicator. - TInspector_Preferences() {} - - //! Destructor - virtual ~TInspector_Preferences() {} - - static Standard_CString PreferencesFileName() { return ".tinspector.xml"; } - - //! Sets path to a preferences file - //! \param thePath a path - void SetDirectory(const TCollection_AsciiString& thePath) - { - reset(); - myDirectory = thePath; - } - - //! Returns path to a preferences file - //! \return path - TCollection_AsciiString GetDirectory() const { return myDirectory; } - - //! Returns plugin preferences - //! \param thePluginName a plugin name - Standard_EXPORT void GetPreferences(const TCollection_AsciiString& thePluginName, - TInspectorAPI_PreferencesDataMap& theItem); - - //! Stores plugin preferences - //! \param thePluginName a plugin name - //! \theItem container of plugin preferences values in form: - void SetPreferences(const TCollection_AsciiString& thePluginName, - const TInspectorAPI_PreferencesDataMap& theItem) - { - myLoadedPreferences.Bind(thePluginName, theItem); - } - - //! Stores plugin preferences into a preferences file - Standard_EXPORT void StorePreferences(); - - //! Removes plugin preferences file - Standard_EXPORT void RemovePreferences(); - -private: - //! Loads the directory preference file with filling internal container - void loadPreferences(); - - //! Clears all internal containers with information of already loaded file - void reset() - { - myLoadedPreferences.Clear(); - myIsLoadedPreferences = Standard_False; - } - - //! Reads plugin preferences and fill container - void readPluginItem(const QDomElement thePluginElement, - TInspectorAPI_PreferencesDataMap& theItem); - - //! Returns text of attribute document - static Standard_CString documentKey() { return "document"; } - - //! Returns text of attribute plugin - static Standard_CString pluginKey() { return "plugin"; } - - //! Returns text of attribute parameter - static Standard_CString parameterKey() { return "parameter"; } - - //! Returns text of attribute name - static Standard_CString nameKey() { return "name"; } - - //! Returns text of attribute value - static Standard_CString valueKey() { return "value"; } - -private: - //! directory of preferences file - TCollection_AsciiString myDirectory; - //! container of already loaded preferences : cache - NCollection_DataMap - myLoadedPreferences; - //! state whether the preferences of the current directory is loaded - Standard_Boolean myIsLoadedPreferences; -}; - -#endif diff --git a/tools/TInspector/TInspector_Shortcut.cxx b/tools/TInspector/TInspector_Shortcut.cxx deleted file mode 100644 index 589b75bf20..0000000000 --- a/tools/TInspector/TInspector_Shortcut.cxx +++ /dev/null @@ -1,56 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TInspector_Shortcut::TInspector_Shortcut(QObject* theParent, TInspector_Window* theWindow) - : QObject(theParent), - myWindow(theWindow) -{ - qApp->installEventFilter(this); -} - -// ======================================================================= -// function : eventFilter -// purpose : -// ======================================================================= -bool TInspector_Shortcut::eventFilter(QObject* theObject, QEvent* theEvent) -{ - if (!myWindow || theEvent->type() != QEvent::KeyRelease) - return QObject::eventFilter(theObject, theEvent); - - QKeyEvent* aKeyEvent = dynamic_cast(theEvent); - switch (aKeyEvent->key()) - { - case Qt::Key_F5: { - myWindow->UpdateContent(); - return true; - } - default: - break; - } - return QObject::eventFilter(theObject, theEvent); -} diff --git a/tools/TInspector/TInspector_Shortcut.hxx b/tools/TInspector/TInspector_Shortcut.hxx deleted file mode 100644 index a834c69dce..0000000000 --- a/tools/TInspector/TInspector_Shortcut.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspector_Shortcut_H -#define TInspector_Shortcut_H - -#include -#include - -#include -#include -#include - -class TInspector_Window; -class QEvent; - -//! \class TInspector_Shortcut -//! Listens application KeyRelease event. Processes key event: -//! - : updates content (tree view model) of the active plugin -class TInspector_Shortcut : public QObject -{ -public: - //! Constructor - Standard_EXPORT TInspector_Shortcut(QObject* theParent, TInspector_Window* theWindow); - - //! Destructor - virtual ~TInspector_Shortcut() {} - - //! Processes key release event to update view model, otherwise do usual QObject functionality - Standard_EXPORT virtual bool eventFilter(QObject* theObject, QEvent* theEvent) Standard_OVERRIDE; - -private: - TInspector_Window* myWindow; //!< the current window -}; - -#endif diff --git a/tools/TInspector/TInspector_Window.cxx b/tools/TInspector/TInspector_Window.cxx deleted file mode 100644 index 7b05985954..0000000000 --- a/tools/TInspector/TInspector_Window.cxx +++ /dev/null @@ -1,607 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int TINSPECTOR_DEFAULT_WIDTH = 650; -const int TINSPECTOR_DEFAULT_HEIGHT = 500; // 350; -const int TINSPECTOR_DEFAULT_POSITION_X = 200; -const int TINSPECTOR_DEFAULT_POSITION_Y = 60; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TInspector_Window::TInspector_Window() - : QObject(), - myOpenButton(0) -{ - myMainWindow = new QMainWindow(); - - QWidget* aCentralWidget = new QWidget(myMainWindow); - myMainWindow->setCentralWidget(aCentralWidget); - QVBoxLayout* aCentralLayout = new QVBoxLayout(aCentralWidget); - aCentralLayout->setContentsMargins(0, 0, 0, 0); - aCentralLayout->setSpacing(0); - - myToolsStack = new QStackedWidget(aCentralWidget); - myToolsStack->setFrameShape(QFrame::Box); - aCentralLayout->addWidget(myToolsStack); - - myEmptyWidget = new QWidget(aCentralWidget); - myToolsStack->addWidget(myEmptyWidget); - - QWidget* aTopWidget = new QWidget(aCentralWidget); - QHBoxLayout* aTopWidgetLayout = new QHBoxLayout(aTopWidget); - aTopWidgetLayout->setContentsMargins(0, 0, 0, 0); - aTopWidgetLayout->setSpacing(0); - - myButtonWidget = new QWidget(aCentralWidget); - myButtonLay = new QHBoxLayout(myButtonWidget); - myButtonLay->setContentsMargins(0, 0, 0, 0); - myButtonLay->setSpacing(0); - myButtonLay->insertStretch(0, 1); - - myButtonGroup = new QButtonGroup(aCentralWidget); - myButtonGroup->setExclusive(true); - - myActionsWidget = new QToolButton(aCentralWidget); - myActionsWidget->setPopupMode(QToolButton::InstantPopup); - myActionsWidget->setIcon(QIcon(":plugin_actions.png")); - myActionsWidget->setIconSize(QSize(20, 20)); - QMenu* anActionsMenu = new QMenu(myActionsWidget); - myActionsWidget->setMenu(anActionsMenu); - connect(anActionsMenu, SIGNAL(aboutToShow()), this, SLOT(onShowActionsMenu())); - - aTopWidgetLayout->addWidget(myButtonWidget, 1); - aTopWidgetLayout->addWidget(myActionsWidget); - - aCentralLayout->addWidget(aTopWidget); - aCentralLayout->addWidget(myToolsStack); - - myMainWindow->resize(TINSPECTOR_DEFAULT_WIDTH, TINSPECTOR_DEFAULT_HEIGHT); - myMainWindow->move(TINSPECTOR_DEFAULT_POSITION_X, TINSPECTOR_DEFAULT_POSITION_Y); - myMainWindow->setDockOptions(QMainWindow::VerticalTabs); - - myParameters = new TInspector_PluginParameters(this); - - myDefaultDirectory = defaultTemporaryDirectory(); - myParameters->SetTemporaryDirectory(myDefaultDirectory); - - applyPreferences(); - - myShortcut = new TInspector_Shortcut(myMainWindow, this); -} - -// ======================================================================= -// function : RegisterPlugin -// purpose : -// ======================================================================= -void TInspector_Window::RegisterPlugin(const TCollection_AsciiString& thePluginName) -{ - TInspector_ToolInfo anInfo; - int aToolId; - if (findPlugin(thePluginName, anInfo, aToolId)) - return; - - myToolNames.append(TInspector_ToolInfo(thePluginName)); -} - -// ======================================================================= -// function : RegisteredPlugins -// purpose : -// ======================================================================= -NCollection_List TInspector_Window::RegisteredPlugins() const -{ - NCollection_List aPlugins; - - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - aPlugins.Append(myToolNames[aToolId].myName); - - return aPlugins; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void TInspector_Window::Init(const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean theAppend) -{ - if (thePluginName.IsEmpty()) - { - // Init all plugins by the given parameters - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - Init(myToolNames[aToolId].myName, theParameters, theAppend); - - // temporary activation of the first tool - if (!myToolNames.isEmpty()) - ActivateTool(myToolNames[0].myName); - return; - } - - if (theAppend) - { - NCollection_List aParameters; - if (myParameters->FindParameters(thePluginName)) - aParameters = myParameters->Parameters(thePluginName); - - for (NCollection_List::Iterator anIterator(theParameters); - anIterator.More(); - anIterator.Next()) - aParameters.Append(anIterator.Value()); - - myParameters->SetParameters(thePluginName, aParameters, Standard_False); - } - else - myParameters->SetParameters(thePluginName, theParameters, Standard_False); - - TInspector_ToolInfo anInfo; - int aToolId; - if (!findPlugin(thePluginName, anInfo, aToolId)) - return; - - if (anInfo.myButton) - return; - - QString aButtonName = anInfo.myName.ToCString(); - if (aButtonName.indexOf("TK") == 0) - aButtonName = aButtonName.mid(2); - - QPushButton* aButton = new QPushButton(aButtonName, myButtonWidget); - aButton->setCheckable(true); - connect(aButton, SIGNAL(clicked(bool)), this, SLOT(onButtonClicked())); - myButtonLay->insertWidget(myButtonLay->count() - 1, aButton); - myButtonGroup->addButton(aButton); - anInfo.myButton = aButton; - myToolNames[aToolId] = anInfo; -} - -// ======================================================================= -// function : ActivateTool -// purpose : -// ======================================================================= -void TInspector_Window::ActivateTool(const TCollection_AsciiString& thePluginName) -{ - int aToolIndex = -1; - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - { - if (myToolNames[aToolId].myName != thePluginName) - continue; - aToolIndex = aToolId; - break; - } - - if (aToolIndex < 0) - return; - - TInspector_ToolInfo anInfo = myToolNames[aToolIndex]; - bool isPluginLoaded = false; - if (!anInfo.myWidget) - { - if (!LoadPlugin(thePluginName, anInfo)) - { - anInfo.myButton->setEnabled(false); - return; - } - isPluginLoaded = true; - myToolsStack->addWidget(anInfo.myWidget); - myToolNames[aToolIndex] = anInfo; - } - - QWidget* aWidget = anInfo.myWidget; - myToolsStack->setCurrentWidget(aWidget); - if (myOpenButton) - myOpenButton->setObjectName(thePluginName.ToCString()); - - anInfo.myCommunicator->UpdateContent(); - if (isPluginLoaded) - { - // apply preferences - TInspectorAPI_PreferencesDataMap aPreferences; - myParameters->GetPreferences(thePluginName, aPreferences); - anInfo.myCommunicator->SetPreferences(aPreferences); - } - onCommuncatorNameChanged(); -} - -// ======================================================================= -// function : SetSelected -// purpose : -// ======================================================================= -void TInspector_Window::SetSelected(const NCollection_List& theItemNames) -{ - TInspector_ToolInfo anInfo; - if (!activeToolInfo(anInfo)) - return; - - myParameters->SetSelectedNames(anInfo.myName, theItemNames); - - TInspectorAPI_Communicator* aCommunicator = anInfo.myCommunicator; - if (aCommunicator) - { - aCommunicator->UpdateContent(); - } -} - -// ======================================================================= -// function : SetSelected -// purpose : -// ======================================================================= -void TInspector_Window::SetSelected(const NCollection_List& theObjects) -{ - TInspector_ToolInfo anInfo; - if (!activeToolInfo(anInfo)) - return; - - myParameters->SetSelected(anInfo.myName, theObjects); - - TInspectorAPI_Communicator* aCommunicator = anInfo.myCommunicator; - if (aCommunicator) - { - aCommunicator->UpdateContent(); - } -} - -// ======================================================================= -// function : SetOpenButton -// purpose : -// ======================================================================= -void TInspector_Window::SetOpenButton(QPushButton* theButton) -{ - myOpenButton = theButton; - TInspector_ToolInfo anInfo; - if (activeToolInfo(anInfo)) - myOpenButton->setObjectName(anInfo.myName.ToCString()); - myButtonLay->insertWidget(0, theButton); -} - -// ======================================================================= -// function : OpenFile -// purpose : -// ======================================================================= -void TInspector_Window::OpenFile(const TCollection_AsciiString& thePluginName, - const TCollection_AsciiString& theFileName) -{ - if (thePluginName.IsEmpty()) - { - // Apply file name to all plugins - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - OpenFile(myToolNames[aToolId].myName, theFileName); - return; - } - - myParameters->AddFileName(thePluginName, theFileName); - - TInspector_ToolInfo anInfo; - if (!activeToolInfo(anInfo) || anInfo.myName != thePluginName) - return; - - TInspectorAPI_Communicator* aCommunicator = anInfo.myCommunicator; - if (aCommunicator) - aCommunicator->UpdateContent(); -} - -// ======================================================================= -// function : UpdateContent -// purpose : -// ======================================================================= -void TInspector_Window::UpdateContent() -{ - TInspector_ToolInfo anInfo; - if (activeToolInfo(anInfo) && anInfo.myCommunicator) - anInfo.myCommunicator->UpdateContent(); -} - -// ======================================================================= -// function : LoadPlugin -// purpose : -// ======================================================================= -bool TInspector_Window::LoadPlugin(const TCollection_AsciiString& thePluginName, - TInspector_ToolInfo& theInfo) -{ - bool aLoaded = false; - - QApplication::setOverrideCursor(Qt::WaitCursor); - TInspectorAPI_Communicator* aCommunicator = - TInspectorAPI_Communicator::LoadPluginLibrary(thePluginName); - - if (aCommunicator) - { - aCommunicator->SetParameters(myParameters); - QWidget* aParentWidget = new QWidget(myMainWindow); - QVBoxLayout* aLayout = new QVBoxLayout(aParentWidget); - aLayout->setContentsMargins(0, 0, 0, 0); - aLayout->setSpacing(0); - aParentWidget->setLayout(aLayout); - aCommunicator->SetParent(aParentWidget); - theInfo.myWidget = aParentWidget; - theInfo.myCommunicator = aCommunicator; -#if QT_VERSION >= 0x050000 - connect(aParentWidget, - SIGNAL(objectNameChanged(const QString&)), - this, - SLOT(onCommuncatorNameChanged())); -#endif - aLoaded = true; - } - QApplication::restoreOverrideCursor(); - return aLoaded; -} - -// ======================================================================= -// function : GetPreferences -// purpose : -// ======================================================================= -void TInspector_Window::GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) -{ - theItem.Bind("geometry", - TreeModel_Tools::ToString(myMainWindow->saveGeometry()).toStdString().c_str()); -} - -// ======================================================================= -// function : SetPreferences -// purpose : -// ======================================================================= -void TInspector_Window::SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) -{ - for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt(theItem); anItemIt.More(); - anItemIt.Next()) - { - if (anItemIt.Key().IsEqual("geometry")) - myMainWindow->restoreGeometry(TreeModel_Tools::ToByteArray(anItemIt.Value().ToCString())); - } -} - -// ======================================================================= -// function : Dump -// purpose : -// ======================================================================= -void TInspector_Window::Dump(Standard_OStream& theStream) const -{ - TInspector_ToolInfo anInfo; - activeToolInfo(anInfo); - - theStream << "Active Plugin: " << anInfo.myName << "\n"; - theStream << "Temporary Directory: " << GetTemporaryDirectory() << "\n"; -} - -// ======================================================================= -// function : OnStorePreferences -// purpose : -// ======================================================================= -void TInspector_Window::OnStorePreferences() -{ - Handle(TInspector_PluginParameters) aParameters = - Handle(TInspector_PluginParameters)::DownCast(myParameters); - TInspectorAPI_PreferencesDataMap aPreferences; - GetPreferences(aPreferences); - aParameters->SetPreferences("Desktop", aPreferences); - - TInspector_ToolInfo anInfo; - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - { - anInfo = myToolNames[aToolId]; - if (!anInfo.myCommunicator) - continue; - - aParameters->GetPreferences(anInfo.myName, aPreferences); - anInfo.myCommunicator->GetPreferences(aPreferences); - myParameters->SetPreferences(anInfo.myName, aPreferences); - } - - // store preferences parameters into a file - aParameters->StorePreferences(); -} - -// ======================================================================= -// function : OnRemovePreferences -// purpose : -// ======================================================================= -void TInspector_Window::OnRemovePreferences() -{ - Handle(TInspector_PluginParameters) aParameters = - Handle(TInspector_PluginParameters)::DownCast(myParameters); - - // remove preferences file - aParameters->RemovePreferences(); - - // restore plugins default state - TInspector_ToolInfo anInfo; - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - { - anInfo = myToolNames[aToolId]; - if (!anInfo.myCommunicator) - continue; - anInfo.myCommunicator->SetPreferences(TInspectorAPI_PreferencesDataMap()); - } -} - -// ======================================================================= -// function : onButtonClicked -// purpose : -// ======================================================================= -void TInspector_Window::onButtonClicked() -{ - QPushButton* aButton = (QPushButton*)sender(); - - TCollection_AsciiString aPluginName = aButton->text().toStdString().c_str(); - - TInspector_ToolInfo anInfo; - int aToolId; - if (!findPlugin(aPluginName, anInfo, aToolId)) - aPluginName = TCollection_AsciiString("TK") + aPluginName; - - ActivateTool(aPluginName); -} - -// ======================================================================= -// function : onShowActionsMenu -// purpose : -// ======================================================================= -void TInspector_Window::onShowActionsMenu() -{ - myActionsWidget->menu()->clear(); - - TInspector_ToolInfo anInfo; - activeToolInfo(anInfo); - - QMenu* aMenu = myActionsWidget->menu(); - anInfo.myCommunicator->FillActionsMenu(aMenu); - - aMenu->addSeparator(); - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Store Preferences"), - SLOT(OnStorePreferences()), - myMainWindow, - this)); - QAction* anAction = ViewControl_Tools::CreateAction(tr("Remove Preferences"), - SLOT(OnRemovePreferences()), - myMainWindow, - this); - anAction->setToolTip("Default state will be restored after restarting the application"); - aMenu->addAction(anAction); -} - -// ======================================================================= -// function : onCommuncatorNameChanged -// purpose : -// ======================================================================= -void TInspector_Window::onCommuncatorNameChanged() -{ -#if QT_VERSION >= 0x050000 - TInspector_ToolInfo anInfo; - if (!activeToolInfo(anInfo)) - return; - myMainWindow->setWindowTitle(anInfo.myWidget->objectName()); -#endif -} - -// ======================================================================= -// function : activeToolInfo -// purpose : -// ======================================================================= -bool TInspector_Window::activeToolInfo(TInspector_Window::TInspector_ToolInfo& theToolInfo) const -{ - QWidget* anActiveWidget = myToolsStack->currentWidget(); - if (anActiveWidget == myEmptyWidget) - return false; - - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - { - if (myToolNames[aToolId].myWidget && myToolNames[aToolId].myWidget == anActiveWidget) - { - theToolInfo = myToolNames[aToolId]; - return true; - } - } - return false; -} - -// ======================================================================= -// function : findPlugin -// purpose : -// ======================================================================= -bool TInspector_Window::findPlugin(const TCollection_AsciiString& thePluginName, - TInspector_ToolInfo& theToolInfo, - int& theToolId) -{ - for (int aToolId = 0, aSize = myToolNames.size(); aToolId < aSize; aToolId++) - { - TInspector_ToolInfo anInfo = myToolNames[aToolId]; - if (anInfo.myName != thePluginName) - continue; - theToolInfo = anInfo; - theToolId = aToolId; - return true; - } - - return false; -} - -// ======================================================================= -// function : applyPreferences -// purpose : -// ======================================================================= -void TInspector_Window::applyPreferences() -{ - TInspectorAPI_PreferencesDataMap aPreferences; - myParameters->GetPreferences("Desktop", aPreferences); - SetPreferences(aPreferences); -} - -// ======================================================================= -// function : defaultTemporaryDirectory -// purpose : -// ======================================================================= -TCollection_AsciiString TInspector_Window::defaultTemporaryDirectory() const -{ - // main window creation - TCollection_AsciiString aTmpDir; -#ifdef _WIN32 - OSD_Environment anEnvironment("TEMP"); - aTmpDir = anEnvironment.Value(); - if (aTmpDir.IsEmpty()) - { - anEnvironment.SetName("TMP"); - aTmpDir = anEnvironment.Value(); - if (aTmpDir.IsEmpty()) - aTmpDir = "C:\\"; - } - if (!aTmpDir.EndsWith("\\")) - aTmpDir += "\\"; - OSD_Path aTmpPath(aTmpDir); - OSD_Directory aTmpDirectory; -#else - OSD_Directory aTmpDirectory = OSD_Directory::BuildTemporary(); - OSD_Path aTmpPath; - aTmpDirectory.Path(aTmpPath); -#endif - aTmpPath.DownTrek("TInspector"); - aTmpDirectory.SetPath(aTmpPath); - if (!aTmpDirectory.Exists()) - aTmpDirectory.Build(OSD_Protection()); - - aTmpDirectory.Path(aTmpPath); - TCollection_AsciiString aTmpDirectoryName; - aTmpPath.SystemName(aTmpDirectoryName); - - return aTmpDir; -} diff --git a/tools/TInspector/TInspector_Window.hxx b/tools/TInspector/TInspector_Window.hxx deleted file mode 100644 index d237d98db5..0000000000 --- a/tools/TInspector/TInspector_Window.hxx +++ /dev/null @@ -1,212 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspector_Window_H -#define TInspector_Window_H - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -class TInspectorAPI_Communicator; -class TInspector_Shortcut; - -class QButtonGroup; -class QMainWindow; -class QHBoxLayout; -class QPushButton; -class QStackedWidget; -class QToolButton; - -//! \class Inspector_Window -//! Control that contains: -//! - stacked widget of loaded plugins -//! - Open button to open file in an active plugin -//! - plugin parameters container -class TInspector_Window : public QObject -{ - Q_OBJECT -private: - //! Container of plugin information - struct TInspector_ToolInfo - { - - //! Constructor - TInspector_ToolInfo(const TCollection_AsciiString& theName = TCollection_AsciiString()) - : myName(theName), - myCommunicator(0), - myButton(0), - myWidget(0) - { - } - - TCollection_AsciiString myName; //!< plugin name - TInspectorAPI_Communicator* myCommunicator; //!< plugin communicator - QPushButton* - myButton; //!< button with plugin name, that will be added into TInspector window layout - QWidget* myWidget; //!< parent widget of the plugin - }; - -public: - //! Constructor - Standard_EXPORT TInspector_Window(); - - //! Destructor - virtual ~TInspector_Window() {} - - //! Appends the plugin names into internal container - //! \param thePluginName a name of the plugin - Standard_EXPORT void RegisterPlugin(const TCollection_AsciiString& thePluginName); - - //! Returns list of registered plugins - //! \return container of plugin names - Standard_EXPORT NCollection_List RegisteredPlugins() const; - - //! Stores parameters for the plugin. If the plugin name is empty, it inits all plugins with the - //! parameters \param thePluginName a name of the plugin \param theParameters container of - //! parameters(e.g. AIS_InteractiveContext, TDocStd_Application) \param theAppend boolean state - //! whether the parameters should be added to existing - Standard_EXPORT void Init(const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean theAppend = Standard_False); - - //! Appends to container of parameters the given name, if the given parameter is active, cal - //! UpdateContent \param thePluginName a name of the plugin \param theParameters container of - //! parameters(e.g. AIS_InteractiveContext, TDocStd_Application) - Standard_EXPORT void OpenFile(const TCollection_AsciiString& thePluginName, - const TCollection_AsciiString& theFileName); - - //! Calls UpdateContent for the active plugin - Standard_EXPORT void UpdateContent(); - - //! Returns the main TInspector window - QMainWindow* GetMainWindow() const { return myMainWindow; } - - //! Activates the plugin. Loads the plugin if it has not been loaded yet - //! \param thePluginName a name of the plugin - Standard_EXPORT void ActivateTool(const TCollection_AsciiString& thePluginName); - - //! Sets item selected in the active plugin - //! \param theItemNames a container of name of items in plugin that should become selected - Standard_EXPORT void SetSelected(const NCollection_List& theItemNames); - - //! Sets objects to be selected in the plugin - //! \param theObjects an objects - Standard_EXPORT void SetSelected(const NCollection_List& theObjects); - - //! Sets open button. Stores into objectName for the button the name of the current plugin to know - //! where the file should be applied \param theButton a button - Standard_EXPORT void SetOpenButton(QPushButton* theButton); - - //! Loads plugin, appends the plugin widget into layout, stores the plugin information - //! \param thePluginName a name of the plugin - //! \param theInfo an output parameter for plugin info - Standard_EXPORT bool LoadPlugin(const TCollection_AsciiString& thePluginName, - TInspector_ToolInfo& theInfo); - - //! Sets path to a directory for temporary plugin files. If parameter is empty, using default - //! directory \param thePath a path - void SetTemporaryDirectory(const TCollection_AsciiString& thePath) - { - myParameters->SetTemporaryDirectory(thePath.IsEmpty() ? myDefaultDirectory : thePath); - } - - //! Returns path to a directory for temporary plugin files - //! \return path - TCollection_AsciiString GetTemporaryDirectory() const - { - return myParameters->GetTemporaryDirectory(); - } - - //! Returns plugins parameters container - //! \return instance of parameters container - Handle(TInspectorAPI_PluginParameters) GetPluginParameters() const { return myParameters; } - - //! Returns plugin preferences: dock widgets state, tree view columns. - //! \param theItem container of preference elements - Standard_EXPORT void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies plugin preferences - //! \param theItem container of preference elements - Standard_EXPORT void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem); - - //! Puts in the stream information about communicator - //! \param theStream stream for output - Standard_EXPORT void Dump(Standard_OStream& theStream) const; - -public slots: - //! Stores preferences (current state) of all plugins into a preferences file - Standard_EXPORT void OnStorePreferences(); - - //! Removes preferences file - Standard_EXPORT void OnRemovePreferences(); - -protected slots: - - //! Activates plugin corresponded to the clicked button - void onButtonClicked(); - - //! Updates available actions by the active plugin - void onShowActionsMenu(); - - //! Updates the TInspector window title giving object name of plugin widget (available only in - //! Qt5) - void onCommuncatorNameChanged(); - -protected: - //! Activates plugin by the plugin info - //! \param theToolInfo an information about plugin - bool activeToolInfo(TInspector_ToolInfo& theToolInfo) const; - - //! Returns true if there is plugin registered by the given name - //! \param thePluginName a name of the plugin - //! \param theToolInfo an output parameter for plugin information - //! \param theToolId an index in internal map - //! \return true if the plugin is found - bool findPlugin(const TCollection_AsciiString& thePluginName, - TInspector_ToolInfo& theToolInfo, - int& theToolId); - - //! Applies desktop preferences to window - void applyPreferences(); - - //! Generates default temp directory by 'TEMP' or 'TMP' environment variables - //! \return generated path - TCollection_AsciiString defaultTemporaryDirectory() const; - -private: - QWidget* myEmptyWidget; //!< widget that is active in tools stack while no one plugin is loaded - QMainWindow* myMainWindow; //!< main control of the window - QStackedWidget* myToolsStack; //!< stack widget of plugin windows - QWidget* myButtonWidget; //!< container of plugin buttons - QPushButton* myOpenButton; //!< button to open file for the active plugin - QHBoxLayout* myButtonLay; //!< layout of plugin buttons - QButtonGroup* myButtonGroup; //!< exclusive toggled button - QToolButton* myActionsWidget; //!< tool button for plugin actions - QList myToolNames; //!< container of plugin names - Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container - TInspector_Shortcut* myShortcut; //!< listener of key events - TCollection_AsciiString myDefaultDirectory; //!< default directory -}; - -#endif diff --git a/tools/TInspector/icons/folder_export.png b/tools/TInspector/icons/folder_export.png deleted file mode 100644 index 5f45f993dc58f4f8442894e836d8e920565b56f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1212 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~A~99;!8$kNlr zF{C2y?JV0okwAeKb7g0l#wk5LJ;oA(6D^C~-b5F$bSEn){$%oC@vzw9($@0i&M}?! z*KA(|uHR#Q`?B@ts9Tfv9k7oM{+p?EdiBoD|F&4^#)x0Lxj}fEr{o8Pcb|nV^_a^} z?a}1_r~dBW?bTo3o;L=GT(Z&R&pC4UU)BDFa#K02-)_+4uL`*n_+Z);_BSHt0sW_1 z=1R>DvWdFmV5=ouR^;RL@ZKY~SAjD(TwcCZWam-dD~pX1xoR|7CqtN8HI4^E3Yl$m zxR)Ig7txTEtB4TuY1P*VFtYiuL1zY6e87T~iU*022BP~GIGp@&;P9pdpq9o-4;$N4 z4~G0`Vp2WK%zwIRlp*)Zi1C4AhY~Z;g5;qIz$|Wfk zE80>McG<9`dbPD@#k@aq!Z~0CP>}7L&m0?;r69qS^G8lP2dqk|Sg@~j zwsKin3`p?7MqB)X(g$Dt$&x(AraYC0zov%e(+*3C$wnWT{$E=L)cja^!tt{Q*G(yu zt}M5|=P4=o;|Ir+!r~3OsS!JD4jlj9p&23Sxx9DFtm8pmd`kQuZphvAxS`6wVoFo< zNoJdE?p<^4ern+2;!_1m-P`fwhui6(pwNIteEm)A-;ab4`@_!{EuO61xfw6)HAL9!}}ErLS*Gw+ls_h9thd;&`wlj#o@&dHnt~p*(7M)Dp(FRE@Rm#kn-=VAj*4H zoWQ0#yyn`?nWP zXZ^ceDgVQAb-Oo>H=Zl};hDFOK^KL6YGFooaGJo+SF^l83!_xCAIqbbt z;~O{c%`Kfa!Q5;y%elYXuD* d)2_bKzx8zgC9VAyzkwwUgQu&X%Q~loCIHBs8X5oq diff --git a/tools/TInspector/icons/folder_import.png b/tools/TInspector/icons/folder_import.png deleted file mode 100644 index 02743abe9b52fc756a8ae82dc712d0f0ef52060e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~A~99;!8=(DGb zV@O5Z+gW?NWZXqs!}n{SzQLi&C*z@DU=jT6K*9&<2#um`GmVb^6{}-;cwB(v3qw&_ zL3&()nt{gjEqQk@m!6I;e*MMg``laiRz=GGNHDp5$MXB)w6e4YTmSyt{_yYZ^er*mFT7s6$QcNK|9Ahna^}iu7q04= zeR7!m$d3DtP-Vm1M@k^E(9>>g=f%W5y|=cki%~Nw*to+ZYL#lq*S|{5cfcwFSofW1 z*n8CVQjqRKt(t=kwMSiZHiiX=?n_{p{P3VyHf!iZZZ-o+xxp^jQoibtI8UOH&5R`7 z4}KMEfPPU>JM0{^hV|R@_5_K^4;3}Tty7;UN}Nck@Zh@UV_C`3W+W*$X_9HMpIp;I zpEma3EnX#Wiw*{;9d6c*R^C;%GeH9w0@KzC#_o-O5l*8Aqa zxhZvVYvrzg8w+Cpo9auPN~ze8n(cD^+~u$8hwdNh?^a2I8BlHPcu!#tXMW54uj;pz znd2Xvzcqu0e_KxPi&xJrr;Gp8nDfeix$pgvLo_{(}wOlh|`^-m3WcTUd?n&9wFej_5ri+X{T&Ou7E`K4(0~ zeGdL(zjF*abmO?9cZsFV-LtM<<&Ib$$M!Gx&L&8J)K>7Gsk>G7cl#mThtD{;*)|>Z zPCOlN)*bix(97LwG2*YpG+50OuD?0`C|;uC)v=h;#^6uKelMT2@7>jZQZw{eZq&rDOE2HE}NKl;&q+Gbv6sMKDC%%oKT??BircxgfVpD^4I%?3VwZv z`_Ol9wl=`0DgPJk_Z_nUg?%%%Ie&6y|$q2jFSYb^~ zkk3Cpj<#sre*CtX!~vEa6~A+S{J8FaxPJZqzNc~Ae^x6=Yo}=acy%&Pdd7DPZ=w6U zSQ@_r)vB`0y4+?z{jYDu3VuWVFpkr+J_!g~@I)>BA^oz}Pr7?*(&lY8Dz&#B1#_Mb zYIFsPh)#ZH^yKVWoyMj9KxyIN%{D2s4{%%O>VyUCSf5wvp;pj)`PdDpt3OJBcl sI(qF@~ diff --git a/tools/TInspector/icons/folder_open.png b/tools/TInspector/icons/folder_open.png deleted file mode 100644 index b0a139ebc65294d49ed5be9612931ffbba86b339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1957 zcmV;W2U_@vP)pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900$vSL_t(oN3EA@Sk!eE$Ju>~1=1dUVLqvwB_f8UtELp2*;;Ao znzt-9BQJ!4gCL2D;NXyAw16|iZ4g8ZE6u#oR*H{+T#}0e!*Cf7Z>mh0W))-#?sTi*1Jy8?}L2*a#cbuu7XeYFl;Vf3#};$@%8($w>BDEt_0wXHdJ_1%JaflLA{BKEc9Eepqnn zWxQ9p5Z*^Tc)X7QP4qBS{;&q3I|ZUG62cq=(HvmIycwc30-{Te>I)wuS^1>Z*crzf z(y;X69H`o&5!JdA5#}(2HU}f6pQrgBa}Zu++Z>OWiB57=7)$%+GVI--%{cqcZ`93m+j( zH5?iHM?<&Ik@VQnSf1p8`T5fk(Hn|wy;~5{6NuoRjhJITs?J7u}8vNR(Ci2faB;$5_7JlhEftAT4u<)`kKK*Y9 z!u}JCwWcLlb?)`M!L0(c(QdqV9R%;lQujJ61_m?C7=W1+!fMpN35)4Hh^CKew}EW5 z!+yEJYid(6sT^dfJ+b}52Uww>haLY5gJ0eRhv4@FbfwYRIyz^WYZ$0z`U8-Kuo|^~ ztO(B=d0oc2c9=l@0-KmFExuNJSp#}<99LGq>2w|21*Ae;^QTjmxcV<-+Cz}f$WTyU zWO4K%OsgR}5^zFm6Ce{)qPY8eU#tS8P6{xsg{XN2;_6iLqLrp|&mox;k{08E^u13& zryBNfVr7Oy_t^-fD4$?Mj=I;JpN&Qu8&tdZDX5jBkRIm=y8zC9BX>acY>28U#K%gC z(gUsfINa_y%*IN^ukG63fZUuq-0u7mzjU8L#ZL+xPMBsF(2)$$z_ML^38Lb8G8yK) zXK?QDtK5h=?D!Z?Nr-JBnKumq+O;UyoV(fZsgVAC4w(nW^9Jr*L5CKieigHx0a5Nv zCPBB?18r4NyvsOtHv7Z$4#$+;-^k@OXyiqK(UXmwe>`gq-ba82qLy=g zg$-Cb0qHUBXscwo+G3gcN;;u~hmPk!aCdNA1>XUp{QwLX1CX6CrN00*gkc4RvgjE&r8diFs%gI}3MyaowvWLrJUZ`wqkI^=xen7v(qE7c`I(!a~jcgOXTP)N;t zSdm3^z%rIiBol@J?aFxthQ*M~F{rx~cwhE?1SF#4{2ZK2oyvaTQmR`=V=koq>1+hm$3;?WUp1c&xDSfPK@^T9V+H}w z%XYGT)dKp9LSx|;WPa|+c+Lduc11V;#{Wk1JhSJPGOmMEHWO0OvyckLk+FlPkhWzr zAl3S_zmjpBzWWEhgNud&4()pi^@Sn4`#4C|D``9%Qt=DKX9!GzRLbC0iy$>I`+}eW zvzKv6+U1JegEZ_t#b!x>RL^;>SxX_S$Ol7UH6#NwH*u6Z4&fX1z}d@Cz~iVb+<|VR z2EB&;xK$m6Tl$^&mwv~PkZo`2BXP4vg}Q<;zJA9rj`QF$E?F#pD*qqQD*6778Nqk| r2ri@FMk-06KXvp-#&90k23-CRXcCO4NhoE%00000NkvXXu0mjfAlJhA diff --git a/tools/TInspector/icons/plugin_actions.png b/tools/TInspector/icons/plugin_actions.png deleted file mode 100644 index 10792a3d8e09f0311c0b559c3530e557585d1014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!V4|msV~BG~rw3hczUg!9oVa8xdqwPq)VG}dCtk1F wvA@jTU~0zm8zFa|sJoopo^qmk&LmfFVdQ&MBb@0PVm^761SM diff --git a/tools/TInspectorAPI/FILES b/tools/TInspectorAPI/FILES deleted file mode 100644 index 63cf600d14..0000000000 --- a/tools/TInspectorAPI/FILES +++ /dev/null @@ -1,5 +0,0 @@ -TInspectorAPI_Communicator.cxx -TInspectorAPI_Communicator.hxx -TInspectorAPI_PluginParameters.cxx -TInspectorAPI_PluginParameters.hxx -TInspectorAPI_PreferencesDataMap.hxx diff --git a/tools/TInspectorAPI/TInspectorAPI_Communicator.cxx b/tools/TInspectorAPI/TInspectorAPI_Communicator.cxx deleted file mode 100644 index dc8a44d0e9..0000000000 --- a/tools/TInspectorAPI/TInspectorAPI_Communicator.cxx +++ /dev/null @@ -1,72 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#ifdef _WIN32 - #include -#else - #include -#endif - -#define LIB_HANDLE HINSTANCE - -// ======================================================================= -// function : LoadPluginLibrary -// purpose : -// ======================================================================= -TInspectorAPI_Communicator* TInspectorAPI_Communicator::LoadPluginLibrary( - const TCollection_AsciiString& thePluginName) -{ - if (thePluginName.IsEmpty()) - std::cout << thePluginName.ToCString() << "%s plugin could not be loaded." << std::endl; - TCollection_AsciiString aPluginLibraryName = thePluginName; -#ifdef _WIN32 - aPluginLibraryName += ".dll"; -#elif __APPLE__ - aPluginLibraryName.Prepend("lib"); - aPluginLibraryName += ".dylib"; -#else - aPluginLibraryName.Prepend("lib"); - aPluginLibraryName += ".so"; -#endif - - COMMUNICATOR_INSTANCE crtInst = 0; -#ifdef _WIN32 - HINSTANCE modLib = ::LoadLibraryA((LPCSTR)aPluginLibraryName.ToCString()); -#else - void* modLib = dlopen(aPluginLibraryName.ToCString(), RTLD_LAZY | RTLD_GLOBAL); -#endif - - if (!modLib) - std::cout << "Failed to load plugin." << aPluginLibraryName.ToCString() << std::endl; - else - { -#ifdef _WIN32 - crtInst = (COMMUNICATOR_INSTANCE)::GetProcAddress(modLib, CREATE_COMMUNICATOR_FUNCTION_NAME); -#else - crtInst = (COMMUNICATOR_INSTANCE)dlsym(modLib, CREATE_COMMUNICATOR_FUNCTION_NAME); -#endif - if (!crtInst) - std::cout << "Failed to find " << CREATE_COMMUNICATOR_FUNCTION_NAME << " function." - << std::endl; - } - TInspectorAPI_Communicator* aModule = crtInst ? crtInst() : 0; - return aModule; -} diff --git a/tools/TInspectorAPI/TInspectorAPI_Communicator.hxx b/tools/TInspectorAPI/TInspectorAPI_Communicator.hxx deleted file mode 100644 index e2edd5e6ae..0000000000 --- a/tools/TInspectorAPI/TInspectorAPI_Communicator.hxx +++ /dev/null @@ -1,83 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspectorAPI_Communicator_H -#define TInspectorAPI_Communicator_H - -#include -#include -#include -#include - -//! The Communicator is an interface that should be implemented for a separate plugin -//! It will be placed in layout of the given parent. After the plugin is created, it is possible to -//! set container of parameters into plugin to provide the plugin's initialization by some external -//! objects(e.g. Interactive Context or OCAF Application). If the parameters are changed, it may be -//! applied in UpdateContent function. The communicator can change parameters in the following -//! cases: -//! - the plugin removes own processed parameters (e.g. file names, that was opened by the plugin) -//! - the plugin sends some parameters to another plugin(by name) (e.g. shape to be analyzed) -//! (at the same time we should be careful here to do not change essential parameters of other -//! plugins) -class TInspectorAPI_Communicator -{ -public: - //! Loads the plugin library - //! \param thePluginName the name of the library - //! \return an instance of the communicator or NULL - static Standard_EXPORT TInspectorAPI_Communicator* LoadPluginLibrary( - const TCollection_AsciiString& thePluginName); - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - Standard_EXPORT virtual void SetParameters( - const Handle(TInspectorAPI_PluginParameters)& theParameters) = 0; - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - Standard_EXPORT virtual void SetParent(void* theParent) = 0; - - //! Provides container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - virtual void FillActionsMenu(void* theMenu) { (void)theMenu; } - - //! Returns plugin preferences, empty implementation by default - virtual void GetPreferences(TInspectorAPI_PreferencesDataMap&) {} - - //! Applies plugin preferences, empty implementation by default - virtual void SetPreferences(const TInspectorAPI_PreferencesDataMap&) {} - - //! Calls update of the plugin's content - Standard_EXPORT virtual void UpdateContent() = 0; - - //! Constructs the communicator. - TInspectorAPI_Communicator() {} - - //! Destructor - virtual ~TInspectorAPI_Communicator() {} -}; - -//! Declare plugin method -extern "C" -{ - //! Declares function to create an instance of communicator - //! It should be implemented in a child plugin - typedef TInspectorAPI_Communicator* (*COMMUNICATOR_INSTANCE)(); -} -//! Defines name of the function that should be implemented in a child plugin -#define CREATE_COMMUNICATOR_FUNCTION_NAME "CreateCommunicator" - -#endif diff --git a/tools/TInspectorAPI/TInspectorAPI_PluginParameters.cxx b/tools/TInspectorAPI/TInspectorAPI_PluginParameters.cxx deleted file mode 100644 index 09b6eb3ef7..0000000000 --- a/tools/TInspectorAPI/TInspectorAPI_PluginParameters.cxx +++ /dev/null @@ -1,295 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -IMPLEMENT_STANDARD_RTTIEXT(TInspectorAPI_PluginParameters, Standard_Transient) - -// ======================================================================= -// function : SetParameters -// purpose : -// ======================================================================= -void TInspectorAPI_PluginParameters::SetParameters( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean&) -{ - if (theParameters.Size() > 0) - myParameters.Bind(thePluginName, theParameters); - else - myParameters.UnBind(thePluginName); -} - -// ======================================================================= -// function : AddFileName -// purpose : -// ======================================================================= -void TInspectorAPI_PluginParameters::AddFileName(const TCollection_AsciiString& thePluginName, - const TCollection_AsciiString& theFileName) -{ - if (myFileNames.IsBound(thePluginName)) - myFileNames.ChangeFind(thePluginName).Append(theFileName); - else - { - NCollection_List aNames; - aNames.Append(theFileName); - myFileNames.Bind(thePluginName, aNames); - } -} - -// ======================================================================= -// function : SetFileNames -// purpose : -// ======================================================================= -void TInspectorAPI_PluginParameters::SetFileNames( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theFileNames) -{ - if (theFileNames.Size() > 0) - myFileNames.Bind(thePluginName, theFileNames); - else - myFileNames.UnBind(thePluginName); -} - -// ======================================================================= -// function : SetSelectedNames -// purpose : -// ======================================================================= -void TInspectorAPI_PluginParameters::SetSelectedNames( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theItemNames) -{ - mySelectedItemNames.Bind(thePluginName, theItemNames); -} - -// ======================================================================= -// function : SetSelected -// purpose : -// ======================================================================= -void TInspectorAPI_PluginParameters::SetSelected( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theObjects) -{ - if (theObjects.Size() > 0) - mySelectedObjects.Bind(thePluginName, theObjects); - else - mySelectedObjects.UnBind(thePluginName); -} - -// ======================================================================= -// function : FindParameters -// purpose : -// ======================================================================= -bool TInspectorAPI_PluginParameters::FindParameters(const TCollection_AsciiString& thePluginName) -{ - return myParameters.IsBound(thePluginName); -} - -// ======================================================================= -// function : Parameters -// purpose : -// ======================================================================= -const NCollection_List& TInspectorAPI_PluginParameters::Parameters( - const TCollection_AsciiString& thePluginName) -{ - return myParameters.Find(thePluginName); -} - -// ======================================================================= -// function : FindFileNames -// purpose : -// ======================================================================= -bool TInspectorAPI_PluginParameters::FindFileNames(const TCollection_AsciiString& thePluginName) -{ - return myFileNames.IsBound(thePluginName); -} - -// ======================================================================= -// function : FileNames -// purpose : -// ======================================================================= -const NCollection_List& TInspectorAPI_PluginParameters::FileNames( - const TCollection_AsciiString& thePluginName) -{ - return myFileNames.Find(thePluginName); -} - -// ======================================================================= -// function : FindSelectedNames -// purpose : -// ======================================================================= -bool TInspectorAPI_PluginParameters::FindSelectedNames(const TCollection_AsciiString& thePluginName) -{ - return mySelectedItemNames.IsBound(thePluginName); -} - -// ======================================================================= -// function : GetSelectedNames -// purpose : -// ======================================================================= -const NCollection_List& TInspectorAPI_PluginParameters::GetSelectedNames( - const TCollection_AsciiString& thePluginName) -{ - return mySelectedItemNames.Find(thePluginName); -} - -// ======================================================================= -// function : GetSelectedObjects -// purpose : -// ======================================================================= -Standard_Boolean TInspectorAPI_PluginParameters::GetSelectedObjects( - const TCollection_AsciiString& thePluginName, - NCollection_List& theObjects) -{ - return mySelectedObjects.Find(thePluginName, theObjects); -} - -// ======================================================================= -// function : toString -// purpose : -// ======================================================================= -TCollection_AsciiString toString(const TopLoc_Location& theLocation) -{ - TCollection_AsciiString anInfo; - gp_Trsf aTrsf = theLocation.Transformation(); - for (int aRowId = 1; aRowId <= 3; aRowId++) - { - if (!anInfo.IsEmpty()) - anInfo += " "; - for (int aColumnId = 1; aColumnId <= 4; aColumnId++) - { - if (aColumnId > 1) - anInfo += ","; - anInfo += TCollection_AsciiString(aTrsf.Value(aRowId, aColumnId)); - } - } - return anInfo; -} - -// ======================================================================= -// function : ParametersToString -// purpose : -// ======================================================================= -TCollection_AsciiString TInspectorAPI_PluginParameters::ParametersToString( - const TopoDS_Shape& theShape) -{ - const TopLoc_Location& aLocation = theShape.Location(); - TCollection_AsciiString aLocationStr = toString(aLocation); - - TopAbs_Orientation anOrientation = theShape.Orientation(); - Standard_SStream aSStream; - TopAbs::Print(anOrientation, aSStream); - return TCollection_AsciiString(aSStream.str().c_str()) + ":" + aLocationStr; -} - -// ======================================================================= -// function : fromString -// purpose : -// ======================================================================= -TopLoc_Location fromString(const TCollection_AsciiString& theValue) -{ - NCollection_Mat4 aValues; - - TCollection_AsciiString aCurrentString = theValue; - Standard_Integer aPosition = aCurrentString.Search(" "); - if (aPosition < 0) - return TopLoc_Location(); - TCollection_AsciiString aTailString = aCurrentString.Split(aPosition); - Standard_Integer aRow = 0; - while (!aCurrentString.IsEmpty()) - { - TCollection_AsciiString aValueString = aCurrentString; - aPosition = aValueString.Search(","); - if (aPosition < 0) - break; - aCurrentString = aValueString.Split(aPosition); - Standard_Integer aColumn = 0; - while (!aValueString.IsEmpty()) - { - aPosition = aCurrentString.Search(" "); - if (aPosition > 0) - aValueString.Split(aValueString.Length() - 1); - - aValues.SetValue(aRow, aColumn, aValueString.RealValue()); - aColumn++; - if (aCurrentString.IsEmpty()) - break; - aValueString = aCurrentString; - aPosition = aValueString.Search(","); - if (aPosition < 0) - { - aValueString = aCurrentString; - aCurrentString = TCollection_AsciiString(); - } - else - aCurrentString = aValueString.Split(aPosition); - } - if (aTailString.IsEmpty()) - break; - aCurrentString = aTailString; - aPosition = aCurrentString.Search(" "); - if (aPosition < 0) - { - aCurrentString = aTailString; - aTailString = TCollection_AsciiString(); - } - else - aTailString = aCurrentString.Split(aPosition); - aRow++; - } - - // if (aValues.Rows() != 3 || aValues.Cols() != 4) - // return TopLoc_Location(); - - gp_Trsf aTrsf; - aTrsf.SetValues(aValues.GetValue(0, 0), - aValues.GetValue(0, 1), - aValues.GetValue(0, 2), - aValues.GetValue(0, 3), - aValues.GetValue(1, 0), - aValues.GetValue(1, 1), - aValues.GetValue(1, 2), - aValues.GetValue(1, 3), - aValues.GetValue(2, 0), - aValues.GetValue(2, 1), - aValues.GetValue(2, 2), - aValues.GetValue(2, 3)); - return TopLoc_Location(aTrsf); -} - -// ======================================================================= -// function : ParametersToShape -// purpose : -// ======================================================================= -void TInspectorAPI_PluginParameters::ParametersToShape(const TCollection_AsciiString& theValue, - TopoDS_Shape& theShape) -{ - int aSeparatorPos = theValue.Search(":"); - TCollection_AsciiString anOrientationStr = theValue; - TCollection_AsciiString aLocationStr = anOrientationStr.Split(aSeparatorPos); - // orientation - if (anOrientationStr.Length() < 2) - return; - anOrientationStr.Split(anOrientationStr.Length() - 1); - - TopAbs_Orientation anOrientation; - if (!TopAbs::ShapeOrientationFromString(anOrientationStr.ToCString(), anOrientation)) - return; - // location - TopLoc_Location aLocation = fromString(aLocationStr); - - theShape.Location(aLocation); - theShape.Orientation(anOrientation); -} diff --git a/tools/TInspectorAPI/TInspectorAPI_PluginParameters.hxx b/tools/TInspectorAPI/TInspectorAPI_PluginParameters.hxx deleted file mode 100644 index 9984378f58..0000000000 --- a/tools/TInspectorAPI/TInspectorAPI_PluginParameters.hxx +++ /dev/null @@ -1,170 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspectorAPI_PluginParameters_H -#define TInspectorAPI_PluginParameters_H - -#include -#include -#include -#include -#include - -#include - -//! The container of parameters for all possible plugins. It stores list of parameters for each -//! plugin, even it was not be loaded yet. There is a map of plugin name into plugin parameters. The -//! parameters may be: -//! - child of Standard_Transient -//! - file name to be opened by the plugin -class TInspectorAPI_PluginParameters : public Standard_Transient -{ -public: - //! Constructs the container. - Standard_EXPORT TInspectorAPI_PluginParameters() {} - - //! Destructor - Standard_EXPORT virtual ~TInspectorAPI_PluginParameters() {} - - //! Stores the parameters for plugin - //! \param thePluginName a plugin name - //! \param theParameters a list of parameters - //! \param theToActivatePlugin a state whether the plugin should be immediately activated, to be - //! used in a heir - Standard_EXPORT virtual void SetParameters( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theParameters, - const Standard_Boolean& theToActivatePlugin = Standard_False); - - //! Adds a file name for the plugin - //! \param thePluginName a plugin name - //! \param theFileName a name - Standard_EXPORT void AddFileName(const TCollection_AsciiString& thePluginName, - const TCollection_AsciiString& theFileName); - - //! Sets file names for the plugin - //! \param thePluginName a plugin name - //! \param theFileNames container of names - Standard_EXPORT void SetFileNames(const TCollection_AsciiString& thePluginName, - const NCollection_List& theFileNames); - - //! Sets a name of item to be selected in the plugin - //! \param thePluginName a plugin name - //! \param theItemNames a container of names to be selected - Standard_EXPORT void SetSelectedNames( - const TCollection_AsciiString& thePluginName, - const NCollection_List& theItemNames); - - //! Sets objects to be selected in the plugin - //! \param thePluginName a plugin name - //! \param theObjects an objects - Standard_EXPORT void SetSelected(const TCollection_AsciiString& thePluginName, - const NCollection_List& theObjects); - - //! Returns true if there are parameters set for the given plugin - //! \param thePluginName a plugin name - //! \return boolean result - Standard_EXPORT bool FindParameters(const TCollection_AsciiString& thePluginName); - - //! Returns parameters set for the given plugin - //! \param thePluginName a plugin name - //! \return container of objects - Standard_EXPORT const NCollection_List& Parameters( - const TCollection_AsciiString& thePluginName); - - //! Returns true if there are file names set for the given plugin - //! \param thePluginName a plugin name - //! \return boolean result - Standard_EXPORT bool FindFileNames(const TCollection_AsciiString& thePluginName); - - //! Returns file names set for the given plugin - //! \param thePluginName a plugin name - //! \return container of names - Standard_EXPORT const NCollection_List& FileNames( - const TCollection_AsciiString& thePluginName); - - //! Returns true if there are file names set for the given plugin - //! \param thePluginName a plugin name - //! \return boolean result - Standard_EXPORT bool FindSelectedNames(const TCollection_AsciiString& thePluginName); - - //! Returns name to be selected in the plugin - //! \param thePluginName a plugin name - //! \return container of names - Standard_EXPORT const NCollection_List& GetSelectedNames( - const TCollection_AsciiString& thePluginName); - - //! Returns objects set for the given plugin - //! \param thePluginName a plugin name - //! \return container of objects - Standard_EXPORT Standard_Boolean - GetSelectedObjects(const TCollection_AsciiString& thePluginName, - NCollection_List& theObjects); - - //! Sets path to a directory for temporary plugin files - //! \param thePath a path - virtual void SetTemporaryDirectory(const TCollection_AsciiString& thePath) - { - myTemporaryDirectory = thePath; - } - - //! Returns path to a directory for temporary plugin files - //! \return path - TCollection_AsciiString GetTemporaryDirectory() const { return myTemporaryDirectory; } - - //! Returns plugin preferences - //! \param thePluginName a plugin name - Standard_EXPORT virtual void GetPreferences(const TCollection_AsciiString& thePluginName, - TInspectorAPI_PreferencesDataMap& theItem) = 0; - - //! Stores plugin preferences - //! \param thePluginName a plugin name - //! \theItem container of plugin preferences values in form: - Standard_EXPORT virtual void SetPreferences(const TCollection_AsciiString& thePluginName, - const TInspectorAPI_PreferencesDataMap& theItem) = 0; - - //! Stores plugin preferences into a preferences file - Standard_EXPORT virtual void StorePreferences() = 0; - - //! Converts a Shape parameters excepting TShape into a string value - //! \param theShape processed shape - //! \return string instance - Standard_EXPORT static TCollection_AsciiString ParametersToString(const TopoDS_Shape& theShape); - - //! Converts a Shape parameters excepting TShape into a string value - //! \param theValue parameters string value (without TShape information) - //! \param theShape processed shape - Standard_EXPORT static void ParametersToShape(const TCollection_AsciiString& theValue, - TopoDS_Shape& theShape); - - DEFINE_STANDARD_RTTIEXT(TInspectorAPI_PluginParameters, Standard_Transient) -private: - //! container of parameters - NCollection_DataMap> - myParameters; - //! container of names - NCollection_DataMap> - myFileNames; - //! container of select item names - NCollection_DataMap> - mySelectedItemNames; - //! container of select objects - NCollection_DataMap> - mySelectedObjects; - //! temporary directory for saving plugin preferences - TCollection_AsciiString myTemporaryDirectory; -}; - -#endif diff --git a/tools/TInspectorAPI/TInspectorAPI_PreferencesDataMap.hxx b/tools/TInspectorAPI/TInspectorAPI_PreferencesDataMap.hxx deleted file mode 100644 index 8c7040731a..0000000000 --- a/tools/TInspectorAPI/TInspectorAPI_PreferencesDataMap.hxx +++ /dev/null @@ -1,27 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TInspectorAPI_PreferencesDataMap_H -#define TInspectorAPI_PreferencesDataMap_H - -#include -#include - -typedef NCollection_DataMap - TInspectorAPI_PreferencesDataMap; -typedef NCollection_DataMap::Iterator - TInspectorAPI_IteratorOfPreferencesDataMap; - -#endif diff --git a/tools/TInspectorEXE/CMakeLists.txt b/tools/TInspectorEXE/CMakeLists.txt deleted file mode 100644 index 2ebcc6e40a..0000000000 --- a/tools/TInspectorEXE/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -project(TInspectorEXE) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -set (EXECUTABLE_PROJECT ON) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -unset (EXECUTABLE_PROJECT) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TInspectorEXE/EXTERNLIB b/tools/TInspectorEXE/EXTERNLIB deleted file mode 100644 index 83dde91d4d..0000000000 --- a/tools/TInspectorEXE/EXTERNLIB +++ /dev/null @@ -1,4 +0,0 @@ -TKTInspector -TKTInspectorAPI -TKernel -CSF_QT \ No newline at end of file diff --git a/tools/TInspectorEXE/FILES b/tools/TInspectorEXE/FILES deleted file mode 100644 index 44a1d285c2..0000000000 --- a/tools/TInspectorEXE/FILES +++ /dev/null @@ -1,2 +0,0 @@ -TInspectorEXE.cxx -EXTERNLIB diff --git a/tools/TInspectorEXE/TInspectorEXE.cxx b/tools/TInspectorEXE/TInspectorEXE.cxx deleted file mode 100644 index 40ccab2257..0000000000 --- a/tools/TInspectorEXE/TInspectorEXE.cxx +++ /dev/null @@ -1,154 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -// ======================================================================= -// function : fileNameInDataDir -// purpose : -// ======================================================================= -TCollection_AsciiString fileNameInDataDir(const TCollection_AsciiString& theEnvironmentDir, - const TCollection_AsciiString& theName) -{ - OSD_Environment anEnvironment(theEnvironmentDir); - - TCollection_AsciiString aFileName = anEnvironment.Value(); - aFileName += TCollection_AsciiString("/") + theName; - - return aFileName; -} - -// ======================================================================= -// function : setPluginSampleDirectory -// purpose : -// ======================================================================= -void setPluginSampleDirectory(const TCollection_AsciiString& theName, - TInspector_Communicator* theCommunicator, - TInspector_OpenButton* theButtonControl) -{ - QStringList aRecentlyOpenedFiles; - TInspector_OpenFileDialog::GetPluginRecentlyOpenedFiles(theName, - theCommunicator, - aRecentlyOpenedFiles); - TCollection_AsciiString aFileName, anAdditionalFileName; - if (!aRecentlyOpenedFiles.isEmpty()) - aFileName = TCollection_AsciiString(aRecentlyOpenedFiles.last().toUtf8().data()); - if (aFileName.IsEmpty()) - { - if (theName.IsEqual("TKDFBrowser")) - aFileName = fileNameInDataDir("CSF_OCCTDataPath", "step/screw.step"); - else if (theName.IsEqual("TKShapeView")) - aFileName = fileNameInDataDir("CSF_OCCTDataPath", "occ/hammer.brep"); - else if (theName.IsEqual("TKVInspector")) - { - aFileName = fileNameInDataDir("CSF_OCCTDataPath", "occ/face1.brep"); - anAdditionalFileName = fileNameInDataDir("CSF_OCCTDataPath", "occ/face2.brep"); - } - aRecentlyOpenedFiles.append(aFileName.ToCString()); - if (!anAdditionalFileName.IsEmpty()) - aRecentlyOpenedFiles.append(anAdditionalFileName.ToCString()); - } - theCommunicator->OpenFile(theName, aFileName.ToCString()); - if (!anAdditionalFileName.IsEmpty()) - theCommunicator->OpenFile(theName, anAdditionalFileName); - - theButtonControl->SetPluginRecentlyOpenedFiles(theName, aRecentlyOpenedFiles); -} - -// ======================================================================= -// function : main -// purpose : -// ======================================================================= -int main(int argc, char** argv) -{ -#if QT_VERSION > 0x050000 - TCollection_AsciiString aPlugindsDirName; - if (TInspector_Communicator::PluginsDir(aPlugindsDirName)) - QApplication::addLibraryPath(aPlugindsDirName.ToCString()); -#endif - QApplication anApp(argc, argv); - - std::set aPlugins; - for (int anArgId = 1; anArgId < argc; anArgId++) - { - if (!strcmp(argv[anArgId], "dfbrowser")) - aPlugins.insert("TKDFBrowser"); - - if (!strcmp(argv[anArgId], "shapeview")) - aPlugins.insert("TKShapeView"); - - if (!strcmp(argv[anArgId], "vinspector")) - aPlugins.insert("TKVInspector"); - - if (!strcmp(argv[anArgId], "messageview")) - aPlugins.insert("TKMessageView"); - } - NCollection_List aParameters; - - // Create tool communicator - TInspector_Communicator* aCommunicator = TInspector_OpenFileDialog::Communicator(); - if (!aCommunicator) - { - std::cout << "Communicator can not be created" << std::endl; - return 0; - } - - TInspector_OpenButton* aButtonControl = new TInspector_OpenButton(0); - TCollection_AsciiString anActivatedPluginName; - if (aPlugins.empty()) - { - aPlugins.insert("TKDFBrowser"); - aPlugins.insert("TKShapeView"); - aPlugins.insert("TKVInspector"); - aPlugins.insert("TKMessageView"); - - anActivatedPluginName = "TKDFBrowser"; - } - else - anActivatedPluginName = *aPlugins.rbegin(); - - for (std::set::const_iterator aPluginIt = aPlugins.begin(); - aPluginIt != aPlugins.end(); - aPluginIt++) - { - TCollection_AsciiString aName = *aPluginIt; - aCommunicator->RegisterPlugin(aName); - aCommunicator->Init(aName, aParameters); - setPluginSampleDirectory(aName, aCommunicator, aButtonControl); - } - aCommunicator->Activate(anActivatedPluginName); - - aCommunicator->SetVisible(true); - aCommunicator->SetOpenButton(aButtonControl->StartButton()); - - return anApp.exec(); -} diff --git a/tools/TKDFBrowser/CMakeLists.txt b/tools/TKDFBrowser/CMakeLists.txt deleted file mode 100644 index a2a5445156..0000000000 --- a/tools/TKDFBrowser/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKDFBrowser) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKDFBrowser/EXTERNLIB b/tools/TKDFBrowser/EXTERNLIB deleted file mode 100644 index 37812a6ca3..0000000000 --- a/tools/TKDFBrowser/EXTERNLIB +++ /dev/null @@ -1,27 +0,0 @@ -TKBin -TKBinL -TKBinXCAF -TKCAF -TKCDF -TKG3d -TKernel -TKLCAF -TKService -TKStd -TKStdL -TKVCAF -TKView -TKXSBase -TKXCAF -TKDESTEP -TKXmlXCAF -TKXml -TKXmlL -TKMath -TKBRep -TKOpenGl -TKV3d -TKTInspectorAPI -TKTreeModel -TKShapeView -CSF_QT \ No newline at end of file diff --git a/tools/TKDFBrowser/FILES b/tools/TKDFBrowser/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKDFBrowser/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKDFBrowser/PACKAGES b/tools/TKDFBrowser/PACKAGES deleted file mode 100644 index 487d7241bf..0000000000 --- a/tools/TKDFBrowser/PACKAGES +++ /dev/null @@ -1,2 +0,0 @@ -DFBrowserPane -DFBrowser diff --git a/tools/TKMessageModel/CMakeLists.txt b/tools/TKMessageModel/CMakeLists.txt deleted file mode 100644 index a6ef727d9e..0000000000 --- a/tools/TKMessageModel/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKMessageModel) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKMessageModel/EXTERNLIB b/tools/TKMessageModel/EXTERNLIB deleted file mode 100644 index 54b02742af..0000000000 --- a/tools/TKMessageModel/EXTERNLIB +++ /dev/null @@ -1,10 +0,0 @@ -TKMath -TKBin -TKBRep -TKGeomBase -TKG3d -TKTInspectorAPI -TKService -TKTopAlgo -TKTreeModel -CSF_QT diff --git a/tools/TKMessageModel/FILES b/tools/TKMessageModel/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKMessageModel/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKMessageModel/PACKAGES b/tools/TKMessageModel/PACKAGES deleted file mode 100644 index 9021fbf297..0000000000 --- a/tools/TKMessageModel/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -MessageModel diff --git a/tools/TKMessageView/CMakeLists.txt b/tools/TKMessageView/CMakeLists.txt deleted file mode 100644 index ee948ecc72..0000000000 --- a/tools/TKMessageView/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKMessageView) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKMessageView/EXTERNLIB b/tools/TKMessageView/EXTERNLIB deleted file mode 100644 index 84e5b5d8b5..0000000000 --- a/tools/TKMessageView/EXTERNLIB +++ /dev/null @@ -1,13 +0,0 @@ -TKTInspectorAPI -TKMath -TKMessageModel -TKBin -TKBRep -TKGeomBase -TKG3d -TKService -TKTopAlgo -TKTreeModel -TKView -TKXml -CSF_QT diff --git a/tools/TKMessageView/FILES b/tools/TKMessageView/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKMessageView/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKMessageView/PACKAGES b/tools/TKMessageView/PACKAGES deleted file mode 100644 index 46a67b229d..0000000000 --- a/tools/TKMessageView/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -MessageView diff --git a/tools/TKShapeView/CMakeLists.txt b/tools/TKShapeView/CMakeLists.txt deleted file mode 100644 index c4dd2e935b..0000000000 --- a/tools/TKShapeView/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKShapeView) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKShapeView/EXTERNLIB b/tools/TKShapeView/EXTERNLIB deleted file mode 100644 index b9f14514bc..0000000000 --- a/tools/TKShapeView/EXTERNLIB +++ /dev/null @@ -1,11 +0,0 @@ -TKTInspectorAPI -TKernel -TKMath -TKBRep -TKGeomBase -TKG3d -TKService -TKTreeModel -TKV3d -TKView -CSF_QT diff --git a/tools/TKShapeView/FILES b/tools/TKShapeView/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKShapeView/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKShapeView/PACKAGES b/tools/TKShapeView/PACKAGES deleted file mode 100644 index 3c39334c4d..0000000000 --- a/tools/TKShapeView/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -ShapeView diff --git a/tools/TKTInspector/CMakeLists.txt b/tools/TKTInspector/CMakeLists.txt deleted file mode 100644 index 23389b74cd..0000000000 --- a/tools/TKTInspector/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -project(TKTInspector) - -set (INSTALL_API ON) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) - -unset (INSTALL_API) diff --git a/tools/TKTInspector/EXTERNLIB b/tools/TKTInspector/EXTERNLIB deleted file mode 100644 index 4570f90e71..0000000000 --- a/tools/TKTInspector/EXTERNLIB +++ /dev/null @@ -1,4 +0,0 @@ -TKernel -TKTInspectorAPI -TKTreeModel -CSF_QT \ No newline at end of file diff --git a/tools/TKTInspector/FILES b/tools/TKTInspector/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKTInspector/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKTInspector/PACKAGES b/tools/TKTInspector/PACKAGES deleted file mode 100644 index 7f1c640da6..0000000000 --- a/tools/TKTInspector/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -TInspector diff --git a/tools/TKTInspectorAPI/CMakeLists.txt b/tools/TKTInspectorAPI/CMakeLists.txt deleted file mode 100644 index 06b3798301..0000000000 --- a/tools/TKTInspectorAPI/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -project(TKTInspectorAPI) - -SET (TOOL_API_LIBRARY ON) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) - -UNSET (TOOL_API_LIBRARY) diff --git a/tools/TKTInspectorAPI/EXTERNLIB b/tools/TKTInspectorAPI/EXTERNLIB deleted file mode 100644 index 0e517c2551..0000000000 --- a/tools/TKTInspectorAPI/EXTERNLIB +++ /dev/null @@ -1,8 +0,0 @@ -TKG3d -TKernel -TKLCAF -TKMath -TKBRep -TKTopAlgo -TKPrim -TKV3d diff --git a/tools/TKTInspectorAPI/FILES b/tools/TKTInspectorAPI/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKTInspectorAPI/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKTInspectorAPI/PACKAGES b/tools/TKTInspectorAPI/PACKAGES deleted file mode 100644 index 72bf985bde..0000000000 --- a/tools/TKTInspectorAPI/PACKAGES +++ /dev/null @@ -1,3 +0,0 @@ -Convert -TInspectorAPI - diff --git a/tools/TKToolsDraw/CMakeLists.txt b/tools/TKToolsDraw/CMakeLists.txt deleted file mode 100644 index d448d51881..0000000000 --- a/tools/TKToolsDraw/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKToolsDraw) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKToolsDraw/EXTERNLIB b/tools/TKToolsDraw/EXTERNLIB deleted file mode 100644 index 95df12df08..0000000000 --- a/tools/TKToolsDraw/EXTERNLIB +++ /dev/null @@ -1,9 +0,0 @@ -TKDraw -TKDCAF -TKTInspector -TKTInspectorAPI -TKernel -TKService -TKV3d -TKViewerTest -CSF_QT \ No newline at end of file diff --git a/tools/TKToolsDraw/FILES b/tools/TKToolsDraw/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKToolsDraw/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKToolsDraw/PACKAGES b/tools/TKToolsDraw/PACKAGES deleted file mode 100644 index 73d18f2157..0000000000 --- a/tools/TKToolsDraw/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -ToolsDraw \ No newline at end of file diff --git a/tools/TKTreeModel/CMakeLists.txt b/tools/TKTreeModel/CMakeLists.txt deleted file mode 100644 index 0b2d9c65eb..0000000000 --- a/tools/TKTreeModel/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKTreeModel) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKTreeModel/EXTERNLIB b/tools/TKTreeModel/EXTERNLIB deleted file mode 100644 index 74b7426c22..0000000000 --- a/tools/TKTreeModel/EXTERNLIB +++ /dev/null @@ -1,6 +0,0 @@ -TKernel -TKMath -TKPrim -TKTopAlgo -TKTInspectorAPI -CSF_QT \ No newline at end of file diff --git a/tools/TKTreeModel/FILES b/tools/TKTreeModel/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKTreeModel/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKTreeModel/PACKAGES b/tools/TKTreeModel/PACKAGES deleted file mode 100644 index b4abb9f985..0000000000 --- a/tools/TKTreeModel/PACKAGES +++ /dev/null @@ -1,2 +0,0 @@ -TreeModel -ViewControl diff --git a/tools/TKVInspector/CMakeLists.txt b/tools/TKVInspector/CMakeLists.txt deleted file mode 100644 index cbe9037f6d..0000000000 --- a/tools/TKVInspector/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKVInspector) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKVInspector/EXTERNLIB b/tools/TKVInspector/EXTERNLIB deleted file mode 100644 index 8b42f7d545..0000000000 --- a/tools/TKVInspector/EXTERNLIB +++ /dev/null @@ -1,12 +0,0 @@ -TKTInspectorAPI -TKBRep -TKG3d -TKernel -TKMath -TKV3d -TKView -TKService -TKTopAlgo -TKTreeModel -TKBO -CSF_QT \ No newline at end of file diff --git a/tools/TKVInspector/FILES b/tools/TKVInspector/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKVInspector/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKVInspector/PACKAGES b/tools/TKVInspector/PACKAGES deleted file mode 100644 index 989972a256..0000000000 --- a/tools/TKVInspector/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -VInspector \ No newline at end of file diff --git a/tools/TKView/CMakeLists.txt b/tools/TKView/CMakeLists.txt deleted file mode 100644 index d630f5bbe3..0000000000 --- a/tools/TKView/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -project(TKView) - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool) - -# This project depends from Qt. -# Qt 5.11.2 is incompatible with c++20. -# So, it should be compiled with c++11/c++14 language standard. -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) diff --git a/tools/TKView/EXTERNLIB b/tools/TKView/EXTERNLIB deleted file mode 100644 index 8cd89c728d..0000000000 --- a/tools/TKView/EXTERNLIB +++ /dev/null @@ -1,9 +0,0 @@ -TKBRep -TKG3d -TKernel -TKMath -TKService -TKOpenGl -TKV3d -TKTInspectorAPI -CSF_QT \ No newline at end of file diff --git a/tools/TKView/FILES b/tools/TKView/FILES deleted file mode 100644 index ca4f0e567b..0000000000 --- a/tools/TKView/FILES +++ /dev/null @@ -1,2 +0,0 @@ -EXTERNLIB -PACKAGES diff --git a/tools/TKView/PACKAGES b/tools/TKView/PACKAGES deleted file mode 100644 index 5c45e15526..0000000000 --- a/tools/TKView/PACKAGES +++ /dev/null @@ -1 +0,0 @@ -View \ No newline at end of file diff --git a/tools/ToolsDraw/FILES b/tools/ToolsDraw/FILES deleted file mode 100644 index d8bdf8cb59..0000000000 --- a/tools/ToolsDraw/FILES +++ /dev/null @@ -1,2 +0,0 @@ -ToolsDraw.cxx -ToolsDraw.hxx diff --git a/tools/ToolsDraw/ToolsDraw.cxx b/tools/ToolsDraw/ToolsDraw.cxx deleted file mode 100644 index 2cd8d65995..0000000000 --- a/tools/ToolsDraw/ToolsDraw.cxx +++ /dev/null @@ -1,467 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#if !defined(_WIN32) -extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(); -#else -Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(); -#endif - -static TInspector_Communicator* MyCommunicator; - -// ======================================================================= -// function : Communicator -// purpose : defines plugin library name by the command argument -// ======================================================================= -TInspector_Communicator* ToolsDraw::Communicator() -{ - return MyCommunicator; -} - -// ======================================================================= -// function : convertToPluginName -// purpose : defines plugin library name by the command argument -// ======================================================================= -Standard_Boolean convertToPluginName(const TCollection_AsciiString& theArgument, - TCollection_AsciiString& thePluginName) -{ - TCollection_AsciiString anArgument = theArgument; - anArgument.LowerCase(); - - if (anArgument == "dfbrowser") - { - thePluginName = "TKDFBrowser"; - return Standard_True; - } - else if (anArgument == "shapeview") - { - thePluginName = "TKShapeView"; - return Standard_True; - } - else if (anArgument == "vinspector") - { - thePluginName = "TKVInspector"; - return Standard_True; - } - else if (anArgument == "messageview") - { - thePluginName = "TKMessageView"; - return Standard_True; - } - - return Standard_False; -} - -// ======================================================================= -// function : getArgumentPlugins -// purpose : fills container of plugin names by the next following plugin names -// ======================================================================= -void getArgumentPlugins(Standard_Integer theArgsNb, - const char** theArgs, - Standard_Integer& theIt, - NCollection_List& thePlugins) -{ - while (theIt != theArgsNb) - { - TCollection_AsciiString aPluginName; - if (convertToPluginName(theArgs[theIt], aPluginName)) - { - if (!thePlugins.Contains(aPluginName)) - thePlugins.Append(aPluginName); - } - else - { - break; - } - theIt++; - } - theIt--; // the last not processed parameter is the next argument -} - -// ======================================================================= -// function : tinspector -// purpose : -// ======================================================================= -static int tinspector(Draw_Interpretor& di, Standard_Integer theArgsNb, const char** theArgs) -{ - if (theArgsNb < 1) - { - std::cout << "Error: wrong number of arguments.\n"; - return 1; - } - - // parse command arguments - NCollection_List aPlugins; - NCollection_DataMap> - aParameters; - NCollection_DataMap anOpenFileParameters; - TCollection_AsciiString aPluginNameToActivate; - Standard_Boolean aNeedToUpdateContent = Standard_False, aNeedToHideInspector = Standard_False, - aNeedToShowInspector = Standard_False, aNeedToPrintState = Standard_False, - aNeedDirectory = Standard_False; - TCollection_AsciiString aTemporaryDirectory; - - NCollection_List aDefaultParameters; - TCollection_AsciiString aDefaultOpenFileParameter; - - NCollection_List anObjectsToSelect; - NCollection_List anItemNamesToSelect; - - for (Standard_Integer anIt = 1; anIt < theArgsNb; ++anIt) - { - TCollection_AsciiString aParam(theArgs[anIt]); - aParam.LowerCase(); - - if (aParam.IsEqual("-plugins")) // [-plugins {name1 [name2] ... [name3] | all}] - { - anIt++; - getArgumentPlugins(theArgsNb, theArgs, anIt, aPlugins); - } - else if (aParam.IsEqual("-activate")) // [-activate name] - { - anIt++; - if (anIt == theArgsNb) - { - std::cout << "Empty argument of '" << aParam << "'.\n"; - return 1; - } - TCollection_AsciiString aPluginName; - if (convertToPluginName(theArgs[anIt], aPluginName)) - aPluginNameToActivate = aPluginName; - } - else if (aParam.IsEqual("-shape")) // [-shape object [name1] ... [nameN]] - { - anIt++; - if (anIt == theArgsNb) - { - std::cout << "Empty argument of '" << aParam << "'.\n"; - return 1; - } - TopoDS_Shape aShape = DBRep::Get(theArgs[anIt]); - anIt++; - if (aShape.IsNull()) - { - std::cout << "Wrong shape name: " << aParam << ".\n"; - return 1; - } - NCollection_List anArgPlugins; - getArgumentPlugins(theArgsNb, theArgs, anIt, anArgPlugins); - - if (anArgPlugins.IsEmpty()) - { - aDefaultParameters.Append(aShape.TShape()); - anItemNamesToSelect.Append(TInspectorAPI_PluginParameters::ParametersToString(aShape)); - } - else - { - for (NCollection_List::Iterator anArgIt(anArgPlugins); - anArgIt.More(); - anArgIt.Next()) - { - NCollection_List aPluginParameters; - aParameters.Find(anArgIt.Value(), aPluginParameters); - aPluginParameters.Append(aShape.TShape()); - anItemNamesToSelect.Append(TInspectorAPI_PluginParameters::ParametersToString(aShape)); - aParameters.Bind(anArgIt.Value(), aPluginParameters); - } - } - } - else if (aParam.IsEqual("-open")) // [-open file_name [name1] ... [nameN]] - { - anIt++; - if (anIt == theArgsNb) - { - std::cout << "Empty argument of '" << aParam << "'.\n"; - return 1; - } - TCollection_AsciiString aFileName(theArgs[anIt]); - anIt++; - - NCollection_List anArgPlugins; - getArgumentPlugins(theArgsNb, theArgs, anIt, anArgPlugins); - if (anArgPlugins.IsEmpty()) - aDefaultOpenFileParameter = aFileName; - else - { - for (NCollection_List::Iterator anArgIt(anArgPlugins); - anArgIt.More(); - anArgIt.Next()) - { - NCollection_List aPluginParameters; - aParameters.Find(anArgIt.Value(), aPluginParameters); - anOpenFileParameters.Bind(anArgIt.Value(), aFileName); - } - } - } - else if (aParam.IsEqual("-directory")) // [-directory path]" - { - anIt++; - if (anIt == theArgsNb) - { - std::cout << "Empty argument of '" << aParam << "'.\n"; - return 1; - } - aNeedDirectory = true; - aParam = theArgs[anIt]; - aTemporaryDirectory = aParam.IsEqual("default") ? "" : aParam; - } - else if (aParam.IsEqual("-state")) // [-state] - { - aNeedToPrintState = Standard_True; - } - else if (aParam.IsEqual("-update")) // [-update] - { - aNeedToUpdateContent = Standard_True; - } - else if (aParam.IsEqual("-select")) // [-select {name|object}] - { - anIt++; - if (anIt == theArgsNb) - { - std::cout << "Empty argument of '" << aParam << "'.\n"; - return 1; - } - // search shape with given name - TopoDS_Shape aShape = DBRep::Get(theArgs[anIt]); - if (!aShape.IsNull()) - { - anObjectsToSelect.Append(aShape.TShape()); - anItemNamesToSelect.Append(TInspectorAPI_PluginParameters::ParametersToString(aShape)); - } - // search prsentations with given name - Handle(AIS_InteractiveObject) anIO; - GetMapOfAIS().Find2(theArgs[anIt], anIO); - if (!anIO.IsNull()) - { - anObjectsToSelect.Append(anIO); - } - // give parameters as a container of names - aParam = TCollection_AsciiString(theArgs[anIt]); - while (!aParam.StartsWith("-")) - { - anItemNamesToSelect.Append(aParam); - anIt++; - if (anIt >= theArgsNb) - break; - aParam = theArgs[anIt]; - } - anIt--; - } - else if (aParam.IsEqual("-show")) // [-show {0|1} = 1] - { - anIt++; - if (anIt == theArgsNb) - { - std::cout << "Empty argument of '" << aParam << "'.\n"; - return 1; - } - aNeedToHideInspector = Draw::Atoi(theArgs[anIt]) == 0; - aNeedToShowInspector = Draw::Atoi(theArgs[anIt]) > 0; - } - else - { - std::cout << "Wrong argument of command: " << aParam.ToCString() << "\n"; - return 1; - } - } - - // start inspector - Standard_Boolean isTInspectorCreation = !MyCommunicator; - if (!MyCommunicator) - MyCommunicator = new TInspector_Communicator(); - - Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext(); - if (!aContext.IsNull()) - aDefaultParameters.Append(aContext); - - // Sets OCAF application into DFBrowser - const Handle(TDocStd_Application)& anApplication = DDocStd::GetApplication(); - // Initialize standard document formats at creation - they should - // be available even if this DRAW plugin is not loaded by pload command - if (!anApplication.IsNull()) - { - NCollection_List aDFBrowserParameters; - aParameters.Find("TKDFBrowser", aDFBrowserParameters); - aDFBrowserParameters.Append(anApplication); - aParameters.Bind("TKDFBrowser", aDFBrowserParameters); - } - - // by starting, if the plugns were not defined, register all - if (isTInspectorCreation) - { - if (aPlugins.IsEmpty()) - { - aPlugins.Append("TKDFBrowser"); - aPlugins.Append("TKShapeView"); - aPlugins.Append("TKVInspector"); - aPlugins.Append("TKMessageView"); - } - aPluginNameToActivate = - !aPluginNameToActivate.IsEmpty() ? aPluginNameToActivate : aPlugins.First(); - } - - // register plugin from parameters - for (NCollection_List::Iterator aPluginNameIt(aPlugins); - aPluginNameIt.More(); - aPluginNameIt.Next()) - MyCommunicator->RegisterPlugin(aPluginNameIt.Value()); - - // init all registered plugins with the default and parameters values - NCollection_List aRegisteredPlugins = - MyCommunicator->RegisteredPlugins(); - for (NCollection_List::Iterator anIterator(aRegisteredPlugins); - anIterator.More(); - anIterator.Next()) - { - TCollection_AsciiString aPluginName = anIterator.Value(); - NCollection_List aParameterValues; - aParameters.Find(aPluginName, aParameterValues); - - for (NCollection_List::Iterator aDefIt(aDefaultParameters); - aDefIt.More(); - aDefIt.Next()) - aParameterValues.Append(aDefIt.Value()); - MyCommunicator->Init(aPluginName, aParameterValues, Standard_True); - } - - if (!aPluginNameToActivate.IsEmpty()) - MyCommunicator->Activate(!aPluginNameToActivate.IsEmpty() ? aPluginNameToActivate - : aPlugins.First()); - - if (!anOpenFileParameters.IsEmpty()) - { - for (NCollection_DataMap::Iterator anOpenIt( - anOpenFileParameters); - anOpenIt.More(); - anOpenIt.Next()) - MyCommunicator->OpenFile(anOpenIt.Key(), anOpenIt.Value()); - } - else if (!aDefaultOpenFileParameter.IsEmpty()) // open file in active plugin - MyCommunicator->OpenFile("", aDefaultOpenFileParameter); - - if (!anObjectsToSelect.IsEmpty()) - MyCommunicator->SetSelected(anObjectsToSelect); - - if (!anItemNamesToSelect.IsEmpty()) - MyCommunicator->SetSelected(anItemNamesToSelect); - - if (aNeedDirectory) - MyCommunicator->SetTemporaryDirectory(aTemporaryDirectory); - - if (aNeedToUpdateContent) - MyCommunicator->UpdateContent(); - - if (isTInspectorCreation || aNeedToShowInspector) - MyCommunicator->SetVisible(true); - - if (aNeedToHideInspector) - MyCommunicator->SetVisible(false); - - if (aNeedToPrintState) - { - Standard_SStream aSStream; - MyCommunicator->Dump(aSStream); - di << aSStream << "\n"; - } - - return 0; -} - -// ======================================================================= -// function : Commands -// purpose : -// ======================================================================= -void ToolsDraw::Commands(Draw_Interpretor& theCommands) -{ - const char* group = "Tools"; - - // display - theCommands.Add( - "tinspector", - "tinspector [-plugins {name1 ... [nameN] | all}]" - "\n\t\t: [-activate name]" - "\n\t\t: [-shape object [name1] ... [nameN]]" - "\n\t\t: [-open file_name [name1] ... [nameN]]" - "\n\t\t: [-update]" - "\n\t\t: [-select {object | name1 ... [nameN]}]" - "\n\t\t: [-show {0|1} = 1]" - "\n\t\t: [-directory path|]" - "\n\t\t: [-state]" - "\n\t\t: Starts tool of inspection." - "\n\t\t: Options:" - "\n\t\t: -plugins enters plugins that should be added in the inspector." - "\n\t\t: Available names are: dfbrowser, vinspector, shapeview and messageview." - "\n\t\t: Plugins order will be the same as defined in arguments." - "\n\t\t: 'all' adds all available plugins in the order:" - "\n\t\t: DFBrowser, VInspector, ShapeView and MessageView." - "\n\t\t: If at the first call this option is not used, 'all' option is applied;" - "\n\t\t: -activate activates the plugin in the tool view." - "\n\t\t: If at the first call this option is not used, the first plugin is activated;" - "\n\t\t: -shape initializes plugin/s by the shape object. If 'name' is empty, initializes all " - "plugins;" - "\n\t\t: -open gives the file to the plugin/s. If the plugin is active, after open, update " - "content will be done;" - "\n\t\t: -update updates content of the active plugin;" - "\n\t\t: -select sets the parameter that should be selected in an active tool view." - "\n\t\t: Depending on active tool the parameter is:" - "\n\t\t: ShapeView: 'object' is an instance of TopoDS_Shape TShape," - "\n\t\t: DFBrowser: 'name' is an entry of TDF_Label and name2(optionally) for " - "TDF_Attribute type name," - "\n\t\t: VInspector: 'object' is an instance of AIS_InteractiveObject;" - "\n\t\t: -show sets Inspector view visible or hidden. The first call of this command will " - "show it." - "\n\t\t: -directory sets Inspector temporary directory. Preferences file is stored there." - "\n\t\t: -state print some current information about inspector, like name of active plugin, " - "temporary director.", - __FILE__, - tinspector, - group); -} - -// ======================================================================= -// function : Factory -// purpose : -// ======================================================================= -void ToolsDraw::Factory(Draw_Interpretor& theDI) -{ - // definition of Tools Command - ToolsDraw::Commands(theDI); - -#ifdef OCCT_DEBUG - theDI << "Draw Plugin : OCC Tools commands are loaded\n"; -#endif -} - -// Declare entry point PLUGINFACTORY -DPLUGIN(ToolsDraw) diff --git a/tools/ToolsDraw/ToolsDraw.hxx b/tools/ToolsDraw/ToolsDraw.hxx deleted file mode 100644 index 23cd21139f..0000000000 --- a/tools/ToolsDraw/ToolsDraw.hxx +++ /dev/null @@ -1,45 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ToolsDraw_H -#define ToolsDraw_H - -#include -#include - -class TInspector_Communicator; - -//! \class ToolsDraw -//! \brief Registers DRAW commands to connect to TInspector tools -class ToolsDraw -{ -public: - DEFINE_STANDARD_ALLOC - - //! Loads all Draw commands of tools. Used for plugin. - //! \param theDI Draw interpreter - Standard_EXPORT static void Factory(Draw_Interpretor& theDI); - - //! Adds all tools command in the Draw_Interpretor - //! \param theCommands - Standard_EXPORT static void Commands(Draw_Interpretor& theCommands); - - //! Returns default communicator used in DRAW commands - Standard_EXPORT static TInspector_Communicator* Communicator(); - -private: -}; - -#endif // ToolsDraw_H diff --git a/tools/TreeModel/FILES b/tools/TreeModel/FILES deleted file mode 100644 index 45b20c9dc0..0000000000 --- a/tools/TreeModel/FILES +++ /dev/null @@ -1,18 +0,0 @@ -TreeModel.qrc -TreeModel_ColumnType.hxx -TreeModel_ContextMenu.cxx -TreeModel_ContextMenu.hxx -TreeModel_HeaderSection.hxx -TreeModel_ItemBase.cxx -TreeModel_ItemBase.hxx -TreeModel_ItemProperties.cxx -TreeModel_ItemProperties.hxx -TreeModel_ItemRole.hxx -TreeModel_ItemStream.cxx -TreeModel_ItemStream.hxx -TreeModel_ModelBase.cxx -TreeModel_ModelBase.hxx -TreeModel_Tools.cxx -TreeModel_Tools.hxx -TreeModel_VisibilityState.cxx -TreeModel_VisibilityState.hxx \ No newline at end of file diff --git a/tools/TreeModel/TreeModel.qrc b/tools/TreeModel/TreeModel.qrc deleted file mode 100644 index 7a6f61c129..0000000000 --- a/tools/TreeModel/TreeModel.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - icons/item_invisible.png - icons/item_visible.png - - diff --git a/tools/TreeModel/TreeModel_ColumnType.hxx b/tools/TreeModel/TreeModel_ColumnType.hxx deleted file mode 100644 index 07a44242c9..0000000000 --- a/tools/TreeModel/TreeModel_ColumnType.hxx +++ /dev/null @@ -1,31 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ColumnType_H -#define TreeModel_ColumnType_H - -#include -#include -#include - -//! Sets custom item role of Tree view wmodel -enum TreeModel_ColumnType -{ - TreeModel_ColumnType_Name = 0, //! name column - TreeModel_ColumnType_Visibility, //! visibility state column - TreeModel_ColumnType_Row //! row of the item column -}; - -#endif diff --git a/tools/TreeModel/TreeModel_ContextMenu.cxx b/tools/TreeModel/TreeModel_ContextMenu.cxx deleted file mode 100644 index b077696778..0000000000 --- a/tools/TreeModel/TreeModel_ContextMenu.cxx +++ /dev/null @@ -1,88 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TreeModel_ContextMenu::TreeModel_ContextMenu(QTreeView* theTreeView) - : QObject(theTreeView), - myTreeView(theTreeView) -{ - myTreeView->header()->setContextMenuPolicy(Qt::CustomContextMenu); -#if QT_VERSION >= 0x050000 - myTreeView->header()->setSectionsClickable(true); -#endif - myTreeView->header()->setHighlightSections(true); - connect(myTreeView->header(), - SIGNAL(customContextMenuRequested(const QPoint&)), - this, - SLOT(onTreeViewHeaderContextMenuRequested(const QPoint&))); -} - -// ======================================================================= -// function : onTreeViewHeaderContextMenuRequested -// purpose : -// ======================================================================= -void TreeModel_ContextMenu::onTreeViewHeaderContextMenuRequested(const QPoint& thePosition) -{ - TreeModel_ModelBase* aModel = dynamic_cast(myTreeView->model()); - if (!aModel) - return; - - QMenu* aMenu = new QMenu(myTreeView); - int aNbSections = aModel->columnCount(); - for (int aColumnId = 0; aColumnId < aNbSections; aColumnId++) - { - QAction* anAction = - ViewControl_Tools::CreateAction(aModel->ChangeHeaderItem(aColumnId)->GetName(), - SLOT(onColumnVisibilityChanged()), - myTreeView, - this); - anAction->setCheckable(true); - anAction->setChecked(!myTreeView->isColumnHidden(aColumnId)); - anAction->setData(aColumnId); - aMenu->addAction(anAction); - } - - if (aMenu->actions().isEmpty()) - return; - - QPoint aPoint = myTreeView->mapToGlobal(thePosition); - aMenu->exec(aPoint); -} - -// ======================================================================= -// function : onColumnVisibilityChanged -// purpose : -// ======================================================================= -void TreeModel_ContextMenu::onColumnVisibilityChanged() -{ - QAction* aClickedAction = (QAction*)sender(); - - myTreeView->setColumnHidden(aClickedAction->data().toInt(), !aClickedAction->isChecked()); -} diff --git a/tools/TreeModel/TreeModel_ContextMenu.hxx b/tools/TreeModel/TreeModel_ContextMenu.hxx deleted file mode 100644 index 5aba964692..0000000000 --- a/tools/TreeModel/TreeModel_ContextMenu.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ContextMenu_H -#define TreeModel_ContextMenu_H - -#include -#include - -#include -#include -#include -#include - -class QTreeView; - -//! \class TreeModel_ContextMenu -//! \brief Creates actions to show/hide tree view columns -class TreeModel_ContextMenu : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT TreeModel_ContextMenu(QTreeView* theTreeView); - - //! Destructor - ~TreeModel_ContextMenu() {} - -protected slots: - //! Shows context menu for tree view header. It contains actions to change columns visibility. - //! \param thePosition a clicked point - void onTreeViewHeaderContextMenuRequested(const QPoint& thePosition); - - //! Changes clicked column visibility - void onColumnVisibilityChanged(); - -private: - QTreeView* myTreeView; //!< current tree view -}; - -#endif diff --git a/tools/TreeModel/TreeModel_HeaderSection.hxx b/tools/TreeModel/TreeModel_HeaderSection.hxx deleted file mode 100644 index f8d9128cbc..0000000000 --- a/tools/TreeModel/TreeModel_HeaderSection.hxx +++ /dev/null @@ -1,99 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_HeaderSection_H -#define TreeModel_HeaderSection_H - -#include -#include - -#include - -#include -#include -#include - -//! \class TreeModel_HeaderSection -//! \brief Container of tree view header sections, like width, visibility, text value -class TreeModel_HeaderSection -{ -public: - //! Constructor - TreeModel_HeaderSection() - : myName(), - myWidth(-1), - myIsHidden(false), - myIsItalic(false) - { - } - - //! Constructor - TreeModel_HeaderSection(const QString& theName, - const int theWidth = -1, - const bool theIsHidden = false, - const bool theIsItalic = false) - : myName(theName), - myWidth(theWidth), - myIsHidden(theIsHidden), - myIsItalic(theIsItalic) - { - } - - //! Destructor - ~TreeModel_HeaderSection() {} - - //! Returns whether the header section is not initialized with values. - //! The check is empty value of the name text - //! \return boolean value - bool IsEmpty() const { return myName.isEmpty(); } - - //! Sets text value - //! \theName text value - void SetName(const QString& theName) { myName = theName; } - - //! Returns text value - QString GetName() const { return myName; } - - //! Sets section width - //! \param theValue width value - void SetWidth(const int theWidth) { myWidth = theWidth; } - - //! Returns section width - int GetWidth(const bool isComputeDefault = true) const - { - return (myWidth == -1 && isComputeDefault) ? TreeModel_Tools::GetTextWidth(GetName(), 0) - : myWidth; - } - - //! Sets section width - void SetIsHidden(bool isHidden) { myIsHidden = isHidden; } - - //! Returns if the section is visiblt - bool IsHidden() const { return myIsHidden; } - - //! Sets section width - void SetIsItalic(bool isItalic) { myIsItalic = isItalic; } - - //! Returns if the section is visiblt - bool IsItalic() const { return myIsItalic; } - -private: - QString myName; //!< text value - int myWidth; //!< section width - bool myIsHidden; //!< visibility - bool myIsItalic; //!< italic -}; - -#endif diff --git a/tools/TreeModel/TreeModel_ItemBase.cxx b/tools/TreeModel/TreeModel_ItemBase.cxx deleted file mode 100644 index 314efe95cf..0000000000 --- a/tools/TreeModel/TreeModel_ItemBase.cxx +++ /dev/null @@ -1,212 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TreeModel_ItemBase::TreeModel_ItemBase(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : m_iStreamChildren(0), - m_bInitialized(false) -{ - m_pParent = theParent; - m_iRow = theRow; - m_iColumn = theColumn; -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void TreeModel_ItemBase::Reset() -{ - for (PositionToItemHash::const_iterator aChildrenIt = m_ChildItems.begin(); - aChildrenIt != m_ChildItems.end(); - aChildrenIt++) - { - TreeModel_ItemBasePtr anItem = aChildrenIt.value(); - if (anItem) - anItem->Reset(); - } - m_bInitialized = false; - if (!myProperties.IsNull()) - { - myProperties->Reset(); - } - myCachedValues.clear(); - myStream.str(""); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void TreeModel_ItemBase::Reset(int theRole) -{ - if (!myCachedValues.contains(theRole)) - return; - - myCachedValues.remove(theRole); -} - -// ======================================================================= -// function : child -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr TreeModel_ItemBase::Child(int theRow, int theColumn, const bool isToCreate) -{ - QPair aPos = qMakePair(theRow, theColumn); - - if (m_ChildItems.contains(aPos)) - return m_ChildItems[aPos]; - - TreeModel_ItemBasePtr anItem; - if (isToCreate) - { - if (theRow < m_iStreamChildren) - anItem = TreeModel_ItemStream::CreateItem(currentItem(), theRow, theColumn); - else - anItem = createChild(theRow - m_iStreamChildren, theColumn); - - if (anItem) - m_ChildItems[aPos] = anItem; - } - return anItem; -} - -// ======================================================================= -// function : Presentations -// purpose : -// ======================================================================= -void TreeModel_ItemBase::Presentations( - NCollection_List& thePresentations) -{ - if (Column() != 0) - return; - - const Handle(TreeModel_ItemProperties)& anItemProperties = Properties(); - if (anItemProperties) - { - anItemProperties->Presentations(thePresentations); - } -} - -// ======================================================================= -// function : currentItem -// purpose : -// ======================================================================= -const TreeModel_ItemBasePtr TreeModel_ItemBase::currentItem() -{ - return TreeModel_ItemBasePtr(this); -} - -// ======================================================================= -// function : cachedValue -// purpose : -// ======================================================================= -QVariant TreeModel_ItemBase::cachedValue(const int theItemRole) const -{ - if (myCachedValues.contains(theItemRole)) - return myCachedValues[theItemRole]; - - QVariant aValueToCache; - if (theItemRole == TreeModel_ItemRole_RowCountRole) - aValueToCache = initRowCount() + const_cast(this)->initStreamRowCount(); - else - aValueToCache = initValue(theItemRole); - - myCachedValues.insert(theItemRole, aValueToCache); - return myCachedValues.contains(theItemRole) ? myCachedValues[theItemRole] : QVariant(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void TreeModel_ItemBase::Init() -{ - m_bInitialized = true; - - initStream(myStream); - initStreamRowCount(); -} - -// ======================================================================= -// function : Object -// purpose : -// ======================================================================= -const Handle(Standard_Transient)& TreeModel_ItemBase::Object() const -{ - static Handle(Standard_Transient) aNullObject; - return aNullObject; -} - -// ======================================================================= -// function : initStreamRowCount -// purpose : -// ======================================================================= -int TreeModel_ItemBase::initStreamRowCount() -{ - int aStreamChildrenCount = 0; - if (Column() == 0) - { - Standard_SStream aStream; - initStream(aStream); - if (!Standard_Dump::Text(aStream).IsEmpty()) - { - if (!myProperties) - { - myProperties = new TreeModel_ItemProperties(); - myProperties->SetItem(currentItem()); - } - myProperties->Init(); - aStreamChildrenCount = myProperties->Children().Extent(); - } - } - m_iStreamChildren = aStreamChildrenCount; - return m_iStreamChildren; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant TreeModel_ItemBase::initValue(const int theItemRole) const -{ - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole) - return QVariant(); - - switch (Column()) - { - case TreeModel_ColumnType_Row: { - return Row(); - } - } - - return QVariant(); -} diff --git a/tools/TreeModel/TreeModel_ItemBase.hxx b/tools/TreeModel/TreeModel_ItemBase.hxx deleted file mode 100644 index 35adc271e0..0000000000 --- a/tools/TreeModel/TreeModel_ItemBase.hxx +++ /dev/null @@ -1,259 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ItemBase_H -#define TreeModel_ItemBase_H - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class TreeModel_ItemBase; -class TreeModel_ItemProperties; - -typedef QExplicitlySharedDataPointer TreeModel_ItemBasePtr; - -//! \class TreeModel_ItemBase -//! \brief Declaration of an abstract interface of model item. -//! -//! The TreeModel_ItemBase class defines the standard interface that model items must use -//! to be able to provide the model information in the tree view architecture. -//! It is not supposed to be instantiated directly. Instead, you should subclass it to -//! create new items. -//! -//! The goal of the item is to be an data container of a custom model, based on the -//! QAbstractItemModel. It provides the items architecture in order to realize the model -//! functionality to find a parent model index by a child index and vice versa. -//! -//! The item should be created by the model and is saved in the internal pointer of the -//! QModelIndex. Only model knows when the index is removed/created. By this cause, -//! the item is wrapped in the QExplicitlySharedDataPointer. It is a counter on the pointer -//! and if there is no index that refers to the item, it is removed automatically. So, -//! there is no necessity to remove the item manually. -//! -//! The item knows a pointer to the parent item and its position into. -//! Some methods of the item should be realized to fill the item content. -//! These are: the children count, a child creation and a child data. -//! -//! The best way of the item using is to request the content of the item from some -//! information object without the caching it. But it can be very expensive realisation, -//! because method data, for example, is called by the viewer repaint, in other words, -//! constantly. -//! -//! It is possible to cache some information in the item. Do not give it through the item -//! constructor. Realize method Init() to save the values in the item internal fields. -//! If the information model is changed, call Reset() for this item, or the item's parent. -//! It leads the item to non initialized state and by the next get of the item content, -//! call Init() method to fulfill the item content again. -class TreeModel_ItemBase : public QSharedData -{ -public: - //! Destructor - virtual ~TreeModel_ItemBase() {} - - //! Gets whether the item is already initialized.The initialized state is thrown down - //! by the reset method and get back after the method Init(). - //! \return if the item is initialized - bool IsInitialized() const { return m_bInitialized; } - - //! Sets the item internal initialized state to the true. If the item has internal values, - //! there should be initialized here. - Standard_EXPORT virtual void Init(); - - //! Returns data object of the item. - //! \return object - Standard_EXPORT virtual const Handle(Standard_Transient)& Object() const; - - //! Resets the item and the child items content. Sets the initialized state to false. - //! If the item has internal values, they should be reset here. - Standard_EXPORT virtual void Reset(); - - //! Resets the item cached value for the parameter role. - //! \param theRole an item role - Standard_EXPORT virtual void Reset(int theRole); - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - const Standard_SStream& Stream() const { return myStream; } - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - virtual bool SetStream(const Standard_SStream& theSStream, - Standard_Integer& theStartPos, - Standard_Integer& theLastPos) const - { - (void)theSStream; - (void)theStartPos; - (void)theLastPos; - return false; - } - - //! Gets the parent of the item, or TreeModel_ItemBasePtr() if it has no parent. - //! \return pointer to the item - TreeModel_ItemBasePtr Parent() const { return m_pParent; }; - - //! Gets the row of the item in the parent - //! \return the row position - int Row() const { return m_iRow; } - - //! Gets the column of the item in the parent - //! \return the column position - int Column() const { return m_iColumn; } - - //! Gets a child tree item in the given position. Find an item in the children hash. - //! Creates a new child item, if there is no a cached item in the given position and - //! if the flag about the creation is true. - //! \param theRow the row of the child item - //! \param theColumn the column of the child item - //! \param isToCreate the flag whether the item should be created if it is not created yet - //! \return the child item or TreeModel_ItemBasePtr() if it does not exist - Standard_EXPORT TreeModel_ItemBasePtr Child(int theRow, - int theColumn, - const bool isToCreate = true); - - //! Sets a custom value for the role in an internal cache - //! \param theValue a value - //! \param theRole a value role - void SetCustomData(const QVariant& theValue, int theRole) - { - myCachedValues.insert(theRole, theValue); - } - - //! Returns the data stored under the given role for the current item - //! \param theIndex the item model index - //! \param theRole the item model role - virtual QVariant data(const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const - { - (void)theIndex; - return cachedValue(theRole); - } - - //! Returns number of rows where the children are - //! \return the row count - int rowCount() const { return cachedValue(TreeModel_ItemRole_RowCountRole).toInt(); } - - //! Returns the item properties - const Handle(TreeModel_ItemProperties)& Properties() const { return myProperties; } - - //! Updates item by the item properties value - virtual void StoreItemProperties(const int theRow, const int theColumn, const QVariant& theValue) - { - (void)theRow, (void)theColumn; - (void)theValue; - } - - //! Returns presentation of the item to be visualized in the view - //! \thePresentations[out] container of presentation handles - Standard_EXPORT virtual void Presentations( - NCollection_List& thePresentations); - -protected: - //! \param theParent the parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - Standard_EXPORT TreeModel_ItemBase(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn); - - //! Initializes the current item. It creates a backup of the specific item information - virtual void initItem() const {} - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) - { - (void)theRow; - (void)theColumn; - return TreeModel_ItemBasePtr(); - } - - //! Wraps the current item by shared pointer - //! \return the shared pointer to the current item - Standard_EXPORT const TreeModel_ItemBasePtr currentItem(); - - //! Returns the cached value for the role. Init the value if it is requested the first time - //! By default, it calls initRowCount(TreeModel_ItemRole_RowCountRole) or initValue for the item - //! role \param theItemRole a value role \return the value - Standard_EXPORT QVariant cachedValue(const int theItemRole) const; - - //! \return number of children. It should be reimplemented in child - virtual int initRowCount() const = 0; - - //! \return number of children. It should be reimplemented in child - Standard_EXPORT int initStreamRowCount(); - - //! Returns data value for the role. It should be reimplemented in child - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - virtual void initStream(Standard_OStream& theOStream) const { (void)theOStream; } - -protected: - Handle(TreeModel_ItemProperties) myProperties; //!< the properties - int m_iStreamChildren; //!< the count of stream items - Standard_SStream myStream; //!< stream value - -private: - typedef QHash, TreeModel_ItemBasePtr> PositionToItemHash; - PositionToItemHash m_ChildItems; //!< the hash of item children - - mutable QMap myCachedValues; //!< cached values, should be cleared by reset - TreeModel_ItemBasePtr m_pParent; //!< the parent item - int m_iRow; //!< the item row position in the parent item - int m_iColumn; //!< the item column position in the parent item - bool m_bInitialized; //!< the state whether the item content is already initialized -}; - -//! Returns an explicitly shared pointer to the pointer held by other, using a -//! dynamic cast to type X to obtain an internal pointer of the appropriate type. -//! If the dynamic_cast fails, the object returned will be null. -//! Example of using: -//! TreeModel_ItemBase* aParent; -//! TreeModel_CustomItemPtr aParentItem = itemDynamicCast(aParent); -//! \param theItem a source item -//! \return a converted item -template -QExplicitlySharedDataPointer itemDynamicCast(const QExplicitlySharedDataPointer& theItem) -{ - X* ptr = dynamic_cast(theItem.data()); - - QExplicitlySharedDataPointer result; - result = ptr; - - return result; -} - -#endif diff --git a/tools/TreeModel/TreeModel_ItemProperties.cxx b/tools/TreeModel/TreeModel_ItemProperties.cxx deleted file mode 100644 index d5ad255373..0000000000 --- a/tools/TreeModel/TreeModel_ItemProperties.cxx +++ /dev/null @@ -1,344 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(TreeModel_ItemProperties, Standard_Transient) - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void TreeModel_ItemProperties::Init() -{ - myRowValues.Clear(); - - InitByStream(Item()->Stream()); -} - -// ======================================================================= -// function : InitByStream -// purpose : -// ======================================================================= -void TreeModel_ItemProperties::InitByStream(const Standard_SStream& aStream) -{ - NCollection_IndexedDataMap aValues; - TCollection_AsciiString aStreamText = Standard_Dump::Text(aStream); - Standard_Dump::SplitJson(aStreamText, aValues); - - TreeModel_ItemStreamPtr aStreamParent = itemDynamicCast(Item()); - TCollection_AsciiString aKey; - Standard_DumpValue aKeyValue; - if (!aStreamParent) - { - if (!Item() || Item()->Object().IsNull()) - { - aKey = "Dump"; - } - else - { - const Handle(Standard_Transient)& anItemObject = Item()->Object(); - aKey = anItemObject.IsNull() ? "Dump" : anItemObject->DynamicType()->Name(); - } - aKeyValue = Standard_DumpValue(aStreamText, 1); - - myKey = aKey; - myStreamValue = aKeyValue; - } - else - { - TCollection_AsciiString aValue; - if (Item()->Parent()) - { - const Handle(TreeModel_ItemProperties)& aParentProperties = Item()->Parent()->Properties(); - if (aParentProperties) - aParentProperties->ChildStream(Item()->Row(), aKey, aKeyValue); - } - myKey = aKey; - myStreamValue = aKeyValue; - - aValues.Clear(); - Standard_Dump::SplitJson(myStreamValue.myValue, aValues); - } - - for (Standard_Integer anIndex = 1; anIndex <= aValues.Size(); anIndex++) - { - Standard_DumpValue aValue = aValues.FindFromIndex(anIndex); - if (Standard_Dump::HasChildKey(aValue.myValue)) - myChildren.Add(aValues.FindKey(anIndex), aValue); - else - { - TreeModel_RowValue aRowValue(aValue.myStartPosition, - aValues.FindKey(anIndex).ToCString(), - aValue.myValue.ToCString()); - myRowValues.Add(myRowValues.Size() + 1, aRowValue); - } - } - if (myRowValues.Size() == 1) - { - Quantity_Color aColor; - if (Convert_Tools::ConvertStreamToColor(aStream, aColor)) - { - Standard_Real aRed, aGreen, aBlue; - aColor.Values(aRed, aGreen, aBlue, Quantity_TOC_sRGB); - - int aDelta = 255; - myRowValues.ChangeFromIndex(1).CustomValues.insert( - (int)Qt::BackgroundRole, - QColor((int)(aRed * aDelta), (int)(aGreen * aDelta), (int)(aBlue * aDelta))); - } - } - // in case if the stream alert has empty key avalue, use as the key the first row value - if ((myKey.IsEmpty() || myKey.IsEqual("Dump")) && myRowValues.Size() > 0) - { - myKey = myRowValues.FindFromIndex(1).Value.toString().toStdString().c_str(); - } -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void TreeModel_ItemProperties::Reset() -{ - myKey = ""; - myStreamValue = Standard_DumpValue(); - - myChildren.Clear(); - myRowValues.Clear(); -} - -// ======================================================================= -// function : RowCount -// purpose : -// ======================================================================= -int TreeModel_ItemProperties::RowCount() const -{ - return RowValues().Size(); -} - -// ======================================================================= -// function : Data -// purpose : -// ======================================================================= -QVariant TreeModel_ItemProperties::Data(const int theRow, const int theColumn, int theRole) const -{ - if (theColumn == 1 && theRole == Qt::BackgroundRole) - { - const QMap& aCachedValues = RowValues().FindFromIndex(theRow + 1).CustomValues; - if (aCachedValues.contains((int)theRole)) - return aCachedValues[(int)theRole]; - } - - if (theRole == Qt::FontRole) // method name is in italic - { - if (Data(theRow, 0, Qt::DisplayRole).toString().contains("className")) - { - QFont aFont = qApp->font(); - aFont.setItalic(true); - return aFont; - } - } - if (theRole == Qt::ForegroundRole) - { - if (Data(theRow, 0, Qt::DisplayRole).toString().contains("className")) - return QColor(Qt::darkGray).darker(150); - } - - if (theRole == Qt::DisplayRole || theRole == Qt::ToolTipRole) - { - if (theColumn == 0) - return RowValues().FindFromIndex(theRow + 1).Key; - else if (theColumn == 1) - return RowValues().FindFromIndex(theRow + 1).Value; - } - - return QVariant(); -} - -// ======================================================================= -// function : EditType -// purpose : -// ======================================================================= -ViewControl_EditType TreeModel_ItemProperties::EditType(const int, const int theColumn) const -{ - if (theColumn == 0) - return ViewControl_EditType_None; - - Quantity_Color aColor; - if (Convert_Tools::ConvertStreamToColor(Item()->Stream(), aColor)) - { - return ViewControl_EditType_Color; - } - return ViewControl_EditType_Line; -} - -// ======================================================================= -// function : ReplaceValue -// purpose : -// ======================================================================= -Standard_Boolean ReplaceValue(const TCollection_AsciiString& theFromValue, - const TCollection_AsciiString& theToValue, - Standard_DumpValue& theStreamValue) -{ - TCollection_AsciiString aStreamValue = theStreamValue.myValue; - - int aPosition = aStreamValue.FirstLocationInSet(theFromValue, 1, aStreamValue.Length()); - if (aPosition < 1) - return Standard_False; - - aPosition += - 2; // due to 'FirstLocationInSet' returns position taking into account '"\' as 1 position - - TCollection_AsciiString aPartStart = aStreamValue.SubString(1, aPosition - 1); - TCollection_AsciiString aPartFinal = - aStreamValue.SubString(aPosition + theFromValue.Length(), aStreamValue.Length()); - theStreamValue.myValue = aPartStart + theToValue + aPartFinal; - - return Standard_True; -} - -// ======================================================================= -// function : SetData -// purpose : -// ======================================================================= -bool TreeModel_ItemProperties::SetData(const int theRow, - const int theColumn, - const QVariant& theValue, - int theRole) -{ - if (theColumn == 0) - return false; - - if (theRole != Qt::DisplayRole && theRole != Qt::EditRole) - return false; - - if (myRowValues.Size() == 1 && theColumn == 1) - { - TCollection_AsciiString aStreamValue(theValue.toString().toStdString().c_str()); - NCollection_IndexedDataMap aKeyToValues; - if (Standard_Dump::SplitJson(aStreamValue, aKeyToValues)) - { - Standard_SStream aStream; - aStream << aStreamValue.ToCString(); - - int aStartPos = 1; - Quantity_ColorRGBA aColor; - if (aColor.InitFromJson(aStream, aStartPos)) - { - Standard_Real aRed, aGreen, aBlue; - aColor.GetRGB().Values(aRed, aGreen, aBlue, Quantity_TOC_sRGB); - int aDelta = 255; - myRowValues.ChangeFromIndex(1).CustomValues.insert( - (int)Qt::BackgroundRole, - QColor((int)(aRed * aDelta), (int)(aGreen * aDelta), (int)(aBlue * aDelta))); - } - Standard_DumpValue aValue = aKeyToValues.FindFromIndex(1); - myStreamValue.myValue = aValue.myValue.ToCString(); - myRowValues.ChangeFromIndex(1).Value = aValue.myValue.ToCString(); - - Item()->StoreItemProperties(theRow, theColumn, theValue); - return true; - } - TCollection_AsciiString aFromValue = - myRowValues.ChangeFromIndex(1).Value.toString().toStdString().c_str(); - if (ReplaceValue(aFromValue, aStreamValue, myStreamValue)) - { - aStreamValue = myStreamValue.myValue; - if (Standard_Dump::SplitJson(aStreamValue, aKeyToValues)) - { - Standard_DumpValue aValue = aKeyToValues.FindFromIndex(1); - myRowValues.ChangeFromIndex(1).Value = aValue.myValue.ToCString(); - - Item()->StoreItemProperties(theRow, theColumn, aStreamValue.ToCString()); - return true; - } - } - } - - myRowValues.ChangeFromIndex(theRow + 1).Value = theValue; - Item()->StoreItemProperties(theRow, theColumn, theValue); - return true; -} - -// ======================================================================= -// function : Presentations -// purpose : -// ======================================================================= -void TreeModel_ItemProperties::Presentations( - NCollection_List& thePresentations) -{ - if (!Item()) - { - return; - } - const Standard_SStream& aStream = Item()->Stream(); - Convert_Tools::ConvertStreamToPresentations(aStream, 1, -1, thePresentations); -} - -// ======================================================================= -// function : TableFlags -// purpose : -// ======================================================================= -Qt::ItemFlags TreeModel_ItemProperties::TableFlags(const int, const int theColumn) const -{ - Qt::ItemFlags aFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - - if (theColumn == 1) - aFlags = aFlags | Qt::ItemIsEditable; - - return aFlags; -} - -// ======================================================================= -// function : ChildStream -// purpose : -// ======================================================================= -void TreeModel_ItemProperties::ChildStream(const int theRowId, - TCollection_AsciiString& theKey, - Standard_DumpValue& theValue) const -{ - if (myChildren.Size() <= theRowId) - return; - - theKey = myChildren.FindKey(theRowId + 1); - theValue = myChildren.FindFromIndex(theRowId + 1); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void TreeModel_ItemProperties::initItem() const -{ - if (!Item()) - return; - if (Item()->IsInitialized()) - return; - Item()->Init(); -} diff --git a/tools/TreeModel/TreeModel_ItemProperties.hxx b/tools/TreeModel/TreeModel_ItemProperties.hxx deleted file mode 100644 index 234d1a0347..0000000000 --- a/tools/TreeModel/TreeModel_ItemProperties.hxx +++ /dev/null @@ -1,183 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ItemProperties_H -#define TreeModel_ItemProperties_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -//! \class TreeModel_ItemProperties -//! Class to manipulate properties of tree item. The properties are organized in table structure -class TreeModel_ItemProperties : public Standard_Transient -{ - //! enum defined the dimension type - enum TreeModel_DimType - { - TreeModel_DimType_Rows, //!< defines number of rows - TreeModel_DimType_Columns //!< defines number of columns - }; - - //! container of values in a row of property table - struct TreeModel_RowValue - { - TreeModel_RowValue(const Standard_Integer theValueStartPosition, - const QVariant& theKey, - QVariant theValue) - : ValueStartPosition(theValueStartPosition), - Key(theKey), - Value(theValue) - { - } - - Standard_Integer ValueStartPosition; //!< start position of the key - QVariant Key; //!< value in the first column - QVariant Value; //!< value in the second column - QMap - CustomValues; //!< custom values, e.g. key is Background, value is a defined color - }; - -public: - //! Constructor - TreeModel_ItemProperties() {} - - //! Destructor - ~TreeModel_ItemProperties() {} - - //! Sets the current item - void SetItem(const TreeModel_ItemBasePtr& theItem) { myItem = theItem; } - - //! Fills properties with the stream value - Standard_EXPORT void InitByStream(const Standard_SStream& theStream); - - //! Returns the current item - TreeModel_ItemBasePtr Item() const { return myItem; } - - //! Fills internal containers by item stream values - Standard_EXPORT void Init(); - - //! If the item has internal values, they should be reset here. - Standard_EXPORT void Reset(); - - //! Returns number of table rows - //! \return an integer value - Standard_EXPORT int RowCount() const; - - //! Returns number of table columns - //! \return an integer value - int ColumnCount() const { return 2; } - - //! Returns content of the model index for the given role, it is obtained from internal container - //! of values \param theRow a model index row \param theColumn a model index column \param theRole - //! a view role \return value interpreted depending on the given role - Standard_EXPORT QVariant Data(const int theRow, - const int theColumn, - int theRole = Qt::DisplayRole) const; - - //! Returns type of edit control for the model index. By default, it is an empty control - //! \param theRow a model index row - //! \param theColumn a model index column - //! \return edit type - Standard_EXPORT ViewControl_EditType EditType(const int theRow, const int theColumn) const; - - //! Sets content of the model index for the given role, it is applied to internal container of - //! values \param theRow a model index row \param theColumn a model index column \param theRole a - //! view role \return true if the value is changed - Standard_EXPORT bool SetData(const int theRow, - const int theColumn, - const QVariant& theValue, - int theRole = Qt::DisplayRole); - - //! Returns presentation of the attribute to be visualized in the view - //! \thePresentations[out] container of presentation handles to be visualized - Standard_EXPORT void Presentations( - NCollection_List& thePresentations); - - //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable. - //! Additional flag for the column 1 is Qt::ItemIsEditable. - //! \param theIndex a model index - //! \return flags - Standard_EXPORT Qt::ItemFlags TableFlags(const int theRow, const int theColumn) const; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT void ChildStream(const int theRowId, - TCollection_AsciiString& theKey, - Standard_DumpValue& theValue) const; - - //! Returns data object of the item. - //! \return object key - const TCollection_AsciiString& Key() const { return myKey; } - - //! Returns stream value of the item. - //! \return value - const TCollection_AsciiString& StreamValue() const { return myStreamValue.myValue; } - - //! Returns children stream values - // const NCollection_IndexedDataMap& Values() const { - // initItem(); return myValues; } - - //! Returns children stream values - const NCollection_IndexedDataMap& RowValues() const - { - initItem(); - return myRowValues; - } - - //! Returns children stream values - const NCollection_IndexedDataMap& Children() const - { - initItem(); - return myChildren; - } - - DEFINE_STANDARD_RTTIEXT(TreeModel_ItemProperties, Standard_Transient) - -protected: - //! Initializes the current item. It creates a backup of the specific item information - Standard_EXPORT void initItem() const; - -private: - TreeModel_ItemBasePtr myItem; //!< current item - - TCollection_AsciiString myKey; //!< the item key - Standard_DumpValue myStreamValue; //!< the stream value - NCollection_IndexedDataMap - myChildren; //!< the children - NCollection_IndexedDataMap myRowValues; //!< the values -}; - -#endif \ No newline at end of file diff --git a/tools/TreeModel/TreeModel_ItemRole.hxx b/tools/TreeModel/TreeModel_ItemRole.hxx deleted file mode 100644 index 164301049f..0000000000 --- a/tools/TreeModel/TreeModel_ItemRole.hxx +++ /dev/null @@ -1,31 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ItemRole_H -#define TreeModel_ItemRole_H - -#include -#include -#include - -//! Sets custom item role of Tree view wmodel -enum TreeModel_ItemRole -{ - TreeModel_ItemRole_RowCountRole = - Qt::UserRole + 1, //! additional column with row count for item (cached value) - TreeModel_ItemRole_LastTreeRole //! last enumeration value to use outside incremented -}; - -#endif diff --git a/tools/TreeModel/TreeModel_ItemStream.cxx b/tools/TreeModel/TreeModel_ItemStream.cxx deleted file mode 100644 index f5d315e3db..0000000000 --- a/tools/TreeModel/TreeModel_ItemStream.cxx +++ /dev/null @@ -1,133 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TreeModel_ItemStream::TreeModel_ItemStream(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn) -{ -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void TreeModel_ItemStream::Init() -{ - TreeModel_ItemBase::Init(); - - int aStreamChildrenCount = 0; - if (Column() == 0) - { - if (!myProperties) - { - myProperties = new TreeModel_ItemProperties(); - myProperties->SetItem(currentItem()); - } - myProperties->Init(); - aStreamChildrenCount = myProperties->Children().Extent(); - } - m_iStreamChildren = aStreamChildrenCount; - initStream(myStream); -} - -// ======================================================================= -// function : Rest -// purpose : -// ======================================================================= -void TreeModel_ItemStream::Reset() -{ - myStream.str(""); - TreeModel_ItemBase::Reset(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant TreeModel_ItemStream::initValue(const int theItemRole) const -{ - QVariant aParentValue = TreeModel_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (Column() != 0) - return QVariant(); - - if (theItemRole == Qt::ForegroundRole) - return QColor(Qt::darkBlue); - - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole - && theItemRole != Qt::ToolTipRole) - return QVariant(); - - switch (Column()) - { - case 0: - return Properties() ? Properties()->Key().ToCString() : ""; - } - return QVariant(); -} - -// ======================================================================= -// function : StoreItemProperties -// purpose : -// ======================================================================= -void TreeModel_ItemStream::StoreItemProperties(const int, const int, const QVariant& theValue) -{ - Parent()->StoreItemProperties(-1, -1, theValue); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void TreeModel_ItemStream::initStream(Standard_OStream& theOStream) const -{ - if (!Properties()) - return; - - theOStream << Properties()->StreamValue(); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void TreeModel_ItemStream::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr TreeModel_ItemStream::createChild(int theRow, int theColumn) -{ - return TreeModel_ItemStream::CreateItem(currentItem(), theRow, theColumn); -} diff --git a/tools/TreeModel/TreeModel_ItemStream.hxx b/tools/TreeModel/TreeModel_ItemStream.hxx deleted file mode 100644 index b33fcea736..0000000000 --- a/tools/TreeModel/TreeModel_ItemStream.hxx +++ /dev/null @@ -1,105 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ItemStream_H -#define TreeModel_ItemStream_H - -#include -#include -#include - -#include - -class TreeModel_ItemProperties; -class TreeModel_ItemStream; - -typedef QExplicitlySharedDataPointer TreeModel_ItemStreamPtr; - -//! \class TreeModel_ItemStream -//! Parent item, that corresponds to AIS_InteractiveContext -//! Children of the item are: -//! - "Property" item to show context attributes such as selection filters and drawer properties -//! - presentation items to show all interactive elements displayed/erased in the context -class TreeModel_ItemStream : public TreeModel_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static TreeModel_ItemStreamPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return TreeModel_ItemStreamPtr(new TreeModel_ItemStream(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~TreeModel_ItemStream() {} - - //! Sets the item internal initialized state to the true. If the item has internal values, - //! there should be initialized here. - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets the item and the child items content. Sets the initialized state to false. - //! If the item has internal values, they should be reset here. - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns number of displayed presentations - //! \return rows count - virtual int initRowCount() const Standard_OVERRIDE - { - initItem(); - return 0; - } - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Stores values of the item properties into the item object - //! \param theRow the child row position - //! \param theColumn the child column position - //! \param theValue the cell value - Standard_EXPORT virtual void StoreItemProperties(const int theRow, - const int theColumn, - const QVariant& theValue) Standard_OVERRIDE; - -protected: - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - - //! Initializes the current item. It creates a backup of the specific item information - //! Does nothing as context has been already set into item - Standard_EXPORT virtual void initItem() const Standard_OVERRIDE; - -protected: - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - Standard_EXPORT virtual TreeModel_ItemBasePtr createChild(int theRow, - int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! \param theParent a parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - Standard_EXPORT TreeModel_ItemStream(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn); -}; - -#endif diff --git a/tools/TreeModel/TreeModel_ModelBase.cxx b/tools/TreeModel/TreeModel_ModelBase.cxx deleted file mode 100644 index 8d82faf377..0000000000 --- a/tools/TreeModel/TreeModel_ModelBase.cxx +++ /dev/null @@ -1,371 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include - -const int COLUMN_NAME_WIDTH = 260; -const int COLUMN_SIZE_WIDTH = 30; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -TreeModel_ModelBase::TreeModel_ModelBase(QObject* theParent) - : QAbstractItemModel(theParent), - m_pUseVisibilityColumn(false), - myVisibilityState(0) -{ - myVisibleIcon = QIcon(":/icons/item_visible.png"); - myInvisibleIcon = QIcon(":/icons/item_invisible.png"); -} - -// ======================================================================= -// function : InitColumns -// purpose : -// ======================================================================= -void TreeModel_ModelBase::InitColumns() -{ - setHeaderItem(TreeModel_ColumnType_Name, TreeModel_HeaderSection("Name", COLUMN_NAME_WIDTH)); - setHeaderItem( - TreeModel_ColumnType_Visibility, - TreeModel_HeaderSection("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); - setHeaderItem(TreeModel_ColumnType_Row, TreeModel_HeaderSection("Row", COLUMN_SIZE_WIDTH)); -} - -// ======================================================================= -// function : GetItemByIndex -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr TreeModel_ModelBase::GetItemByIndex(const QModelIndex& theIndex) -{ - TreeModel_ItemBase* anItem = (TreeModel_ItemBase*)theIndex.internalPointer(); - return TreeModel_ItemBasePtr(anItem); -} - -// ======================================================================= -// function : reset -// purpose : -// ======================================================================= -void TreeModel_ModelBase::Reset() -{ - for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) - { - TreeModel_ItemBasePtr aRootItem = RootItem(aColId); - if (aRootItem) - aRootItem->Reset(); - } -} - -// ======================================================================= -// function : index -// purpose : -// ======================================================================= -QModelIndex TreeModel_ModelBase::index(int theRow, - int theColumn, - const QModelIndex& theParent) const -{ - if (!hasIndex(theRow, theColumn, theParent)) - return QModelIndex(); - - // to create index on the root item - if (!theParent.isValid()) - return createIndex(theRow, theColumn, getIndexValue(RootItem(theColumn))); - - TreeModel_ItemBasePtr aParentItem; - if (!theParent.isValid()) - aParentItem = RootItem(theColumn); - else - aParentItem = GetItemByIndex(theParent); - - TreeModel_ItemBasePtr aChildItem = aParentItem->Child(theRow, theColumn); - return aChildItem ? createIndex(theRow, theColumn, getIndexValue(aChildItem)) : QModelIndex(); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant TreeModel_ModelBase::data(const QModelIndex& theIndex, int theRole) const -{ - if (!theIndex.isValid()) - return QVariant("undefined"); - - if (IsUseVisibilityColumn() && theIndex.column() == TreeModel_ColumnType_Visibility) - { - if (theRole != Qt::DecorationRole) - return QVariant(); - - TreeModel_ItemBasePtr anItem = GetItemByIndex(theIndex); - if (!anItem->data(theIndex, theRole).isNull()) // value is already in cache - return anItem->data(theIndex, theRole); - - if (!anItem->IsInitialized()) - anItem->Init(); - - if (!myVisibilityState || !myVisibilityState->CanBeVisible(theIndex)) - return QVariant(); - - QVariant aValue = myVisibilityState->IsVisible(theIndex) ? myVisibleIcon : myInvisibleIcon; - anItem->SetCustomData(aValue, theRole); - return aValue; - } - - TreeModel_ItemBasePtr anItem = GetItemByIndex(theIndex); - QVariant anItemData = anItem->data(theIndex, theRole); - - if (anItemData.isNull() && theRole == Qt::BackgroundRole - && myHighlightedIndices.contains(theIndex)) - anItemData = TreeModel_Tools::LightHighlightColor(); - - return anItemData; -} - -// ======================================================================= -// function : parent -// purpose : -// ======================================================================= -QModelIndex TreeModel_ModelBase::parent(const QModelIndex& theIndex) const -{ - if (!theIndex.isValid()) - return QModelIndex(); - - TreeModel_ItemBasePtr aChildItem = GetItemByIndex(theIndex); - TreeModel_ItemBasePtr aParentItem = aChildItem ? aChildItem->Parent() : TreeModel_ItemBasePtr(); - - if (!aParentItem) - return QModelIndex(); - - return createIndex(aParentItem->Row(), aParentItem->Column(), getIndexValue(aParentItem)); -} - -// ======================================================================= -// function : flags -// purpose : -// ======================================================================= -Qt::ItemFlags TreeModel_ModelBase::flags(const QModelIndex& theIndex) const -{ - if (!theIndex.isValid()) - { - return Qt::ItemFlags(); - } - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; -} - -// ======================================================================= -// function : headerData -// purpose : -// ======================================================================= -QVariant TreeModel_ModelBase::headerData(int theSection, - Qt::Orientation theOrientation, - int theRole) const -{ - if (theOrientation != Qt::Horizontal || theRole != Qt::DisplayRole) - return QVariant(); - - if (IsUseVisibilityColumn() && theSection == TreeModel_ColumnType_Visibility) - return QVariant(); - - return myHeaderValues[theSection].GetName(); -} - -// ======================================================================= -// function : rowCount -// purpose : -// ======================================================================= -int TreeModel_ModelBase::rowCount(const QModelIndex& theParent) const -{ - // to create index on the root item - if (!theParent.isValid()) - return 1; - - TreeModel_ItemBasePtr aParentItem; - if (!theParent.isValid()) - aParentItem = RootItem(0); - else - aParentItem = GetItemByIndex(theParent); - - if (!aParentItem) - return 0; - - return aParentItem ? aParentItem->rowCount() : 0; -} - -// ======================================================================= -// function : EmitLayoutChanged -// purpose : -// ======================================================================= -void TreeModel_ModelBase::EmitLayoutChanged() -{ - emit layoutChanged(); -} - -// ======================================================================= -// function : EmitLayoutChanged -// purpose : -// ======================================================================= -void TreeModel_ModelBase::EmitDataChanged(const QModelIndex& theTopLeft, - const QModelIndex& theBottomRight, - const QVector& theRoles, - const bool isResetItem) -{ - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(theTopLeft); - if (anItemBase && isResetItem) - anItemBase->Reset(); - -#if QT_VERSION < 0x050000 - (void)theRoles; - emit dataChanged(theTopLeft, theBottomRight); -#else - emit dataChanged(theTopLeft, theBottomRight, theRoles); -#endif -} - -// ======================================================================= -// function : Selected -// purpose : -// ======================================================================= -QModelIndexList TreeModel_ModelBase::Selected(const QModelIndexList& theIndices, - const int theCellId, - const Qt::Orientation theOrientation) -{ - QModelIndexList aSelected; - for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(); - anIndicesIt != theIndices.end(); - anIndicesIt++) - { - QModelIndex anIndex = *anIndicesIt; - if ((theOrientation == Qt::Horizontal && anIndex.column() == theCellId) - || (theOrientation == Qt::Vertical && anIndex.row() == theCellId)) - aSelected.append(anIndex); - } - return aSelected; -} - -// ======================================================================= -// function : SingleSelected -// purpose : -// ======================================================================= -QModelIndex TreeModel_ModelBase::SingleSelected(const QModelIndexList& theIndices, - const int theCellId, - const Qt::Orientation theOrientation) -{ - QModelIndexList aSelected = Selected(theIndices, theCellId, theOrientation); - return aSelected.size() == 1 ? aSelected.first() : QModelIndex(); -} - -// ======================================================================= -// function : SelectedItems -// purpose : -// ======================================================================= -QList TreeModel_ModelBase::SelectedItems(const QModelIndexList& theIndices) -{ - QList anItems; - - for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(); - anIndicesIt != theIndices.end(); - anIndicesIt++) - { - TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex(*anIndicesIt); - if (!anItem || anItems.contains(anItem)) - continue; - anItems.append(anItem); - } - return anItems; -} - -// ======================================================================= -// function : SubItemsPresentations -// purpose : -// ======================================================================= -void TreeModel_ModelBase::SubItemsPresentations( - const QModelIndexList& theIndices, - NCollection_List& thePresentations) -{ - QList anItems; - - for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(); - anIndicesIt != theIndices.end(); - anIndicesIt++) - { - TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex(*anIndicesIt); - if (!anItem || anItems.contains(anItem)) - continue; - subItemsPresentations(anItem, thePresentations); - } -} - -// ======================================================================= -// function : subItemPresentations -// purpose : -// ======================================================================= -void TreeModel_ModelBase::subItemsPresentations( - const TreeModel_ItemBasePtr& theItem, - NCollection_List& thePresentations) -{ - theItem->Presentations(thePresentations); - - QList anItems; - for (int aRowId = 0; aRowId < theItem->rowCount(); aRowId++) - { - subItemsPresentations(theItem->Child(aRowId, theItem->Column()), thePresentations); - } -} - -// ======================================================================= -// function : createRoot -// purpose : -// ======================================================================= -void TreeModel_ModelBase::createRoot(const int theColumnId) -{ - myRootItems.insert(theColumnId, createRootItem(theColumnId)); -} - -// ======================================================================= -// function : setHeaderItem -// purpose : -// ======================================================================= -void TreeModel_ModelBase::setHeaderItem(const int theColumnId, - const TreeModel_HeaderSection& theSection) -{ - if (theSection.IsEmpty()) - { - // remove section - myHeaderValues.remove(theColumnId); - myRootItems.remove(theColumnId); - } - - myHeaderValues[theColumnId] = theSection; - createRoot(theColumnId); -} - -// ======================================================================= -// function : getIndexValue -// purpose : -// ======================================================================= -void* TreeModel_ModelBase::getIndexValue(const TreeModel_ItemBasePtr& theItem) -{ - return theItem.data(); -} diff --git a/tools/TreeModel/TreeModel_ModelBase.hxx b/tools/TreeModel/TreeModel_ModelBase.hxx deleted file mode 100644 index 8eb7f9ba0a..0000000000 --- a/tools/TreeModel/TreeModel_ModelBase.hxx +++ /dev/null @@ -1,246 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_ModelBase_H -#define TreeModel_ModelBase_H - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -class TreeModel_VisibilityState; - -//! \class TreeModel_ModelBase -//! \brief Implementation of the tree item based model of QAbstractItemModel. -//! The TreeModel_ModelBase class defines the abstract model realization through the base item -//! architecture. By the model index creation, a base item is created and attached to the index. -//! Each item contains an iformation about the item parent, position in the parent and -//! the item's children. So, it is possible to get the model index relation from the item. -class TreeModel_ModelBase : public QAbstractItemModel -{ -public: - //! Constructor - //! \param theParent the parent object - Standard_EXPORT TreeModel_ModelBase(QObject* theParent = 0); - - //! Destructor - virtual ~TreeModel_ModelBase() {} - - //! Creates model columns and root items. - //! Default columns are: [0] - Name, [1] - Visibility, [2] - Row - Standard_EXPORT virtual void InitColumns(); - - //! Returns the item shared pointer by the model index - //! if it is in the index internal pointer - //! @param theIndex a model index - Standard_EXPORT static TreeModel_ItemBasePtr GetItemByIndex(const QModelIndex& theIndex); - - //! Resets the model items content. Calls the same method of the root item. - //! It leads to reset of all child/sub child items. - Standard_EXPORT virtual void Reset(); - - //! Returns the model root item. - //! It is realized for OCAFBrowser - TreeModel_ItemBasePtr RootItem(const int theColumn) const { return myRootItems[theColumn]; } - - //! Emits the layoutChanged signal from outside of this class - Standard_EXPORT void EmitLayoutChanged(); - - //! Emits the dataChanged signal from outside of this class - Standard_EXPORT void EmitDataChanged(const QModelIndex& theTopLeft, - const QModelIndex& theBottomRight, - const QVector& theRoles = QVector(), - const bool isResetItem = true); - - //! Sets state whether visibility column (0) is used in the model - //! \param theState state - void SetUseVisibilityColumn(const bool theState) { m_pUseVisibilityColumn = theState; } - - //! Returns state whether visibility column (0) is used in the model - //! \param theState state - bool IsUseVisibilityColumn() const { return m_pUseVisibilityColumn; } - - //! Fills visibility state checker - //! \param theController the checker interface - void SetVisibilityState(TreeModel_VisibilityState* theController) - { - myVisibilityState = theController; - } - - //! Returns visibility state checker - //! \return the checker interface - TreeModel_VisibilityState* GetVisibilityState() const { return myVisibilityState; } - - //! Returns true if the tree view model contains highlighted items. This highlight is set - //! manually. - bool HasHighlighted() { return !myHighlightedIndices.isEmpty(); } - - //! Sets items of the indices highlighted in the model. - //! \param theIndices a list of tree model indices - void SetHighlighted(const QModelIndexList& theIndices = QModelIndexList()) - { - myHighlightedIndices = theIndices; - } - - //! Returns the index of the item in the model specified by the given row, column and parent - //! index. Saves an internal pointer at the createIndex. This pointer is a shared pointer to the - //! class, that realizes a base item interface. If the parent is invalid, a root item is used, - //! otherwise a new item is created by the pointer item saved the parent model index \param theRow - //! the index row position \param theColummn the index column position \param theParent the parent - //! index \return the model index - Standard_EXPORT virtual QModelIndex index(int theRow, - int theColumn, - const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns the data stored under the given role for the item referred to by the index. - //! \param theIndex a model index - //! \param theRole an enumeration value of role for data obtaining - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Returns the parent index by the child index. Founds the item, saved in the index; - //! obtains the parent item by the item. Create a new index by the item and containing it. - //! \param theIndex a model index - Standard_EXPORT virtual QModelIndex parent(const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Returns the item flags for the given index. The base class implementation returns a - //! combination of flags that enables the item (ItemIsEnabled) and allows it to be selected - //! (ItemIsSelectable) \param theIndex the model index \return Qt flag combination - Standard_EXPORT virtual Qt::ItemFlags flags(const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Returns the header data for the given role and section in the header with the specified - //! orientation. \param theSection the header section. For horizontal headers - column number, for - //! vertical headers - row number. \param theOrientation a header orientation \param theRole a - //! data role \return the header data - Standard_EXPORT virtual QVariant headerData(int theSection, - Qt::Orientation theOrientation, - int theRole = Qt::DisplayRole) const - Standard_OVERRIDE; - - //! Returns the number of rows under the given parent. When the parent is valid it means that - //! rowCount is returning the number of children of parent. \param theParent a parent model index - //! \return the number of rows - Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns header item, that can be modified - //! \param theColumnId a column index - //! \return header section value - TreeModel_HeaderSection* ChangeHeaderItem(const int theColumnId) - { - return &myHeaderValues[theColumnId]; - } - - //! Returns count of columns in the model - //! \param theParent an index of the parent item - //! \return integer value - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return myHeaderValues.size(); - } - - //! Returns default value of the visibility column - //! \return integer value - static int ColumnVisibilityWidth() { return 20; } - - //! Returns selected items in the cell of given orientation. - //! \param theIndices a container of selected indices - //! \param theCellId column index if orientation is horizontal, row index otherwise - //! \param theOrientation an orientation to apply the cell index - //! \return model indices from the list - Standard_EXPORT static QModelIndexList Selected( - const QModelIndexList& theIndices, - const int theCellId, - const Qt::Orientation theOrientation = Qt::Horizontal); - - //! Returns single selected item in the cell of given orientation. If the orientation is - //! Horizontal, in the cell id column, one row should be selected. \param theIndices a container - //! of selected indices \param theCellId column index if orientation is horizontal, row index - //! otherwise \param theOrientation an orientation to apply the cell index \return model index - //! from the list - Standard_EXPORT static QModelIndex SingleSelected( - const QModelIndexList& theIndices, - const int theCellId, - const Qt::Orientation theOrientation = Qt::Horizontal); - - //! Returns selected tree model items for indices. - //! \param theIndices a container of selected indices - //! \return model items from the list - Standard_EXPORT static QList SelectedItems( - const QModelIndexList& theIndices); - - //! Returns presentations of sub items - //! \param theIndices a container of selected indices - //! \thePresentations[out] container of presentations - Standard_EXPORT static void SubItemsPresentations( - const QModelIndexList& theIndices, - NCollection_List& thePresentations); - -protected: - //! Creates root item - //! \param theColumnId index of a column - virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) = 0; - - //! Sets header properties item. - //! \param theColumnId a column index - //! \param theSection a section value - Standard_EXPORT void setHeaderItem(const int theColumnId, - const TreeModel_HeaderSection& theSection); - - //! Converts the item shared pointer to void* type - //! \param theItem - //! \return an item pointer - Standard_EXPORT static void* getIndexValue(const TreeModel_ItemBasePtr& theItem); - - //! Returns presentations of sub items. Recursive method to get presentations of all children - //! \param theItem an item to get own presentations and presentations of children - //! \thePresentations[out] container of presentations found - static void subItemsPresentations(const TreeModel_ItemBasePtr& theItem, - NCollection_List& thePresentations); - -private: - //! Creates root item - //! \param theColumnId index of a column - Standard_EXPORT void createRoot(const int theColumnId); - -protected: - QMap - myRootItems; //!< container of root items, for each column own root item - QMap myHeaderValues; //!< header values - //!< model subclass. The model is fulfilled by this item content - - bool m_pUseVisibilityColumn; //!< the state whether column=0 is reserved for Visibility state - TreeModel_VisibilityState* myVisibilityState; //!< the interface of item visibility - QIcon myVisibleIcon; //!< icon of visible state - QIcon myInvisibleIcon; //!< icon of invisible state - - QModelIndexList - myHighlightedIndices; //!< tree model indices that should be visualized as highlighted -}; - -#endif diff --git a/tools/TreeModel/TreeModel_Tools.cxx b/tools/TreeModel/TreeModel_Tools.cxx deleted file mode 100644 index 64a32e9309..0000000000 --- a/tools/TreeModel/TreeModel_Tools.cxx +++ /dev/null @@ -1,257 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int INFO_LENGHT = 60; - -// ======================================================================= -// function : ToString -// purpose : -// ======================================================================= -QString TreeModel_Tools::ToString(const QByteArray& theValue) -{ - char aBuffer[8]; - QStringList aBytesList; - for (int aByteId = 0; aByteId < theValue.size(); aByteId++) - { - ::sprintf(aBuffer, "#%02X", (unsigned char)theValue.at(aByteId)); - aBytesList.append(QString(aBuffer)); - } - return QString("@ByteArray[%1]").arg(aBytesList.join(" ")); -} - -// ======================================================================= -// function : ToByteArray -// purpose : -// ======================================================================= -QByteArray TreeModel_Tools::ToByteArray(const QString& theValue) -{ - QByteArray aStateArray; - if (!theValue.startsWith("@ByteArray[") || !theValue.endsWith(']')) - return aStateArray; - - QString aValue = theValue.mid(11, theValue.size() - 12); -#include - QStringList lst = aValue.split(QRegExp("[\\s|,]"), QString::SkipEmptyParts); -#include - for (QStringList::ConstIterator aByteId = lst.begin(); aByteId != lst.end(); ++aByteId) - { - int aBase = 10; - QString aString = *aByteId; - if (aString.startsWith("#")) - { - aBase = 16; - aString = aString.mid(1); - } - bool isOk = false; - int aNum = aString.toInt(&isOk, aBase); - if (!isOk || aNum < 0 || aNum > 255) - continue; - aStateArray.append((char)aNum); - } - return aStateArray; -} - -// ======================================================================= -// function : SaveState -// purpose : -// ======================================================================= -void TreeModel_Tools::SaveState(QTreeView* theTreeView, - QMap& theItems, - const QString& thePrefix) -{ - QStringList aColumnWidths; - for (int aColumnId = 0; aColumnId < theTreeView->model()->columnCount(); aColumnId++) - { - if (theTreeView->isColumnHidden(aColumnId)) - { - aColumnWidths.append(QString()); - } - else - aColumnWidths.append(QString::number(theTreeView->columnWidth(aColumnId))); - } - theItems[thePrefix + "columns_width"] = aColumnWidths.join(","); -} - -// ======================================================================= -// function : RestoreState -// purpose : -// ======================================================================= -bool TreeModel_Tools::RestoreState(QTreeView* theTreeView, - const QString& theKey, - const QString& theValue, - const QString& thePrefix) -{ - if (theKey == thePrefix + "columns_width") - { - QStringList aValues = theValue.split(","); - for (int aColumnId = 0; - aColumnId < theTreeView->model()->columnCount() && aColumnId < aValues.size(); - aColumnId++) - { - bool isOk; - int aWidth = aValues.at(aColumnId).toInt(&isOk); - if (isOk && !theTreeView->isColumnHidden(aColumnId)) // do not resize hidden columns - theTreeView->setColumnWidth(aColumnId, aWidth); - } - } - else - return false; - return true; -} - -// ======================================================================= -// function : SetDefaultHeaderSections -// purpose : -// ======================================================================= -void TreeModel_Tools::SetDefaultHeaderSections(QTreeView* theTreeView) -{ - TreeModel_ModelBase* aTreeModel = dynamic_cast(theTreeView->model()); - - for (int aColumnId = 0, aNbColumns = aTreeModel->columnCount(); aColumnId < aNbColumns; - aColumnId++) - { - TreeModel_HeaderSection* aSection = aTreeModel->ChangeHeaderItem(aColumnId); - theTreeView->setColumnWidth(aColumnId, aSection->GetWidth()); - theTreeView->setColumnHidden(aColumnId, aSection->IsHidden()); - } -} - -// ======================================================================= -// function : UseVisibilityColumn -// purpose : -// ======================================================================= -void TreeModel_Tools::UseVisibilityColumn(QTreeView* theTreeView, const bool theActive) -{ - QHeaderView* aHeader = theTreeView->header(); -#if QT_VERSION < 0x050000 - aHeader->setResizeMode(TreeModel_ColumnType_Visibility, QHeaderView::Fixed); -#else - aHeader->setSectionResizeMode(TreeModel_ColumnType_Visibility, QHeaderView::Fixed); -#endif - aHeader->moveSection(TreeModel_ColumnType_Name, TreeModel_ColumnType_Visibility); - - TreeModel_ModelBase* aModel = dynamic_cast(theTreeView->model()); - TreeModel_HeaderSection* anItem = aModel->ChangeHeaderItem((int)TreeModel_ColumnType_Visibility); - anItem->SetIsHidden(theActive); - anItem->SetWidth(TreeModel_ModelBase::ColumnVisibilityWidth()); - - aModel->SetUseVisibilityColumn(theActive); -} - -// ======================================================================= -// function : GetTextWidth -// purpose : -// ======================================================================= -int TreeModel_Tools::GetTextWidth(const QString& theText, QObject*) -{ - // TODO: find margins like QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, - // (QWidget*)theParent); - int aTextMargin = 10; - QFontMetrics aFontMetrics(QApplication::font()); - QRect aBoundingRect = aFontMetrics.boundingRect(theText); -#include - return qMax(aBoundingRect.width(), aFontMetrics.width(theText)) + aTextMargin * 2; -#include -} - -// ======================================================================= -// function : CutString -// purpose : -// ======================================================================= -QString TreeModel_Tools::CutString(const QString& theText, - const int theWidth, - const QString& theTail) -{ - if (theText.isEmpty()) - return theText; - - int aLength = theWidth < 0 ? INFO_LENGHT : theWidth - 3; - - int anIndex = theText.indexOf('\n'); - if (anIndex > 0 && anIndex < aLength) - aLength = anIndex; - - return aLength < theText.length() ? theText.mid(0, aLength) + theTail : theText; -} - -// ======================================================================= -// function : LightHighlightColor -// purpose : -// ======================================================================= -QColor TreeModel_Tools::LightHighlightColor() -{ - QWidget aWidget; - QPalette aPalette = aWidget.palette(); - return aPalette.highlight().color().lighter(); -} - -// ======================================================================= -// function : SetExpandedTo -// purpose : -// ======================================================================= -void TreeModel_Tools::SetExpandedTo(QTreeView* theTreeView, const QModelIndex& theIndex) -{ - QAbstractItemModel* aModel = theTreeView->model(); - - QModelIndex aParent = aModel->parent(theIndex); - while (aParent.isValid()) - { - theTreeView->setExpanded(aParent, true); - aParent = aModel->parent(aParent); - } -} - -// ======================================================================= -// function : setExpanded -// purpose : -// ======================================================================= -void TreeModel_Tools::SetExpanded(QTreeView* theTreeView, - const QModelIndex& theIndex, - const bool isExpanded, - int& theLevels) -{ - bool isToExpand = theLevels == -1 || theLevels > 0; - if (!isToExpand) - return; - - theTreeView->setExpanded(theIndex, isExpanded); - if (theLevels != -1) - theLevels--; - - QAbstractItemModel* aModel = theTreeView->model(); - for (int aRowId = 0, aRows = aModel->rowCount(theIndex); aRowId < aRows; aRowId++) - { - int aLevels = theLevels; - SetExpanded(theTreeView, aModel->index(aRowId, 0, theIndex), isExpanded, aLevels); - } -} diff --git a/tools/TreeModel/TreeModel_Tools.hxx b/tools/TreeModel/TreeModel_Tools.hxx deleted file mode 100644 index 41b058f51e..0000000000 --- a/tools/TreeModel/TreeModel_Tools.hxx +++ /dev/null @@ -1,120 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_Tools_H -#define TreeModel_Tools_H - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class QAction; -class QObject; -class QTreeView; - -//! \class TreeModel_Tools -//! \brief The tool that gives auxiliary methods for qt elements manipulation -class TreeModel_Tools -{ -public: - //! Converts a Qt string to byte array, string has mask: @ByteArray[...] - //! \param theValue a converted string - //! \return the extended filled array - Standard_EXPORT static QString ToString(const QByteArray& theValue); - - //! Converts a Qt byte array to Qt string. It has mask: @ByteArray[...] - //! \param theValue a converted string - //! \return the extended filled array - Standard_EXPORT static QByteArray ToByteArray(const QString& theValue); - - //! Returns header margin, defined in style settings of application - //! \return integer value - static int HeaderSectionMargin() { return qApp->style()->pixelMetric(QStyle::PM_HeaderMargin); } - - //! Saves state of tree view in a container in form: key, value. It saves: - //! - visibility of columns, - //! - columns width - //! \param theTreeView a view instance - //! \param[out] theItems properties - //! \param thePrefix preference item prefix - Standard_EXPORT static void SaveState(QTreeView* theTreeView, - QMap& theItems, - const QString& thePrefix = QString()); - - //! Restores state of tree view by a container - //! \param theTreeView a view instance - //! \param theKey property key - //! \param theValue property value - //! \param thePrefix preference item prefix - //! \return boolean value whether the property is applied to the tree view - Standard_EXPORT static bool RestoreState(QTreeView* theTreeView, - const QString& theKey, - const QString& theValue, - const QString& thePrefix = QString()); - - //! Fills tree view by default sections parameters obtained in view's tree model - //! \param theTreeView tree view instance - Standard_EXPORT static void SetDefaultHeaderSections(QTreeView* theTreeView); - - //! Sets using visibility column in the tree view: - //! - sets the state in the TreeModel - //! - set section width, not resizable - //! \param theTreeView a view instance - //! \param theActive boolean value if the column should be connected/visible and other - Standard_EXPORT static void UseVisibilityColumn(QTreeView* theTreeView, - const bool theActive = true); - - //! Returns the text width - //! \param theText source text - //! \param theParent parent widget with its own style - //! \return calculated width value - Standard_EXPORT static int GetTextWidth(const QString& theText, QObject* theParent); - - //! Returns string cut by width and '\n' - //! \param theText processing string - //! \param theWidth width value, if -1, default value is used - //! \param theTail symbols added to the end of the cut string - Standard_EXPORT static QString CutString(const QString& theText, - const int theWidth = -1, - const QString& theTail = "..."); - - //! Returns light highlight color - //! \returns Qt color - Standard_EXPORT static QColor LightHighlightColor(); - - //! Makes the view expanded from the root till the index - Standard_EXPORT static void SetExpandedTo(QTreeView* theTreeView, const QModelIndex& theIndex); - - //! Expands items in tree view staring from the index recursive in given number of levels - //! \param theTreeView an OCAF tree view - //! \param theParentIndex an index which children should be expanded - //! \param isExpanded a boolean state if the item should be expanded or collapsed - //! \param theLevels a number of levels to be expanded, or -1 for all levels - Standard_EXPORT static void SetExpanded(QTreeView* theTreeView, - const QModelIndex& theIndex, - const bool isExpanded, - int& theLevels); -}; - -#endif diff --git a/tools/TreeModel/TreeModel_VisibilityState.cxx b/tools/TreeModel/TreeModel_VisibilityState.cxx deleted file mode 100644 index 2be26abad3..0000000000 --- a/tools/TreeModel/TreeModel_VisibilityState.cxx +++ /dev/null @@ -1,32 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -// ======================================================================= -// function : OnClicked -// purpose : -// ======================================================================= -bool TreeModel_VisibilityState::processClicked(const QModelIndex& theIndex) -{ - if (theIndex.column() != TreeModel_ColumnType_Visibility) - return false; - - if (!CanBeVisible(theIndex)) - return false; - - SetVisible(theIndex, !IsVisible(theIndex), true); - return true; -} diff --git a/tools/TreeModel/TreeModel_VisibilityState.hxx b/tools/TreeModel/TreeModel_VisibilityState.hxx deleted file mode 100644 index cd1b14023a..0000000000 --- a/tools/TreeModel/TreeModel_VisibilityState.hxx +++ /dev/null @@ -1,75 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_VisibilityState_H -#define TreeModel_VisibilityState_H - -#include -#include - -#include -#include - -//! \class TreeModel_VisibilityState -//! \brief Interface that provides connection between model and visualization control to: -//! - know whether the model item is visible -//! - change visibility of the model item -class TreeModel_VisibilityState -{ -public: - //! Constructor - TreeModel_VisibilityState(TreeModel_ModelBase* theModel) - : myModel(theModel) - { - } - - //! Destructor - ~TreeModel_VisibilityState() {} - - //! Returns true if visibility of the item can be changed - //! \param theIndex tree model index - //! \return boolean value - virtual bool CanBeVisible(const QModelIndex& theIndex) const = 0; - - //! Sets visibility state - //! \param theIndex tree model index - //! \param theState visibility state - //! \param toEmitDataChanged boolean flag whether emit of the model should be done immediately - //! \return true if state is changed - virtual bool SetVisible(const QModelIndex& theIndex, - const bool theState, - const bool toEmitDataChanged = true) = 0; - - //! Returns visibility state value - //! \param theIndex tree model index - //! \return boolean value - virtual bool IsVisible(const QModelIndex& theIndex) const = 0; - -protected: - //! Processes the mouse clicked on the index. - //! It changes the item visibility if model allows to change it. - //! \theIndex tree model index - //! \return true if click is processed - Standard_EXPORT bool processClicked(const QModelIndex& theIndex); - -protected: - //! tree view model - TreeModel_ModelBase* getModel() const { return myModel; } - -private: - TreeModel_ModelBase* myModel; //!< tree view model -}; - -#endif diff --git a/tools/TreeModel/icons/item_invisible.png b/tools/TreeModel/icons/item_invisible.png deleted file mode 100644 index 8feb1e7bcaa3718388d778991b9fdb51009df4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmV;v0YUzWP)zlCg^FU=T)6!bOxsECbd?0*XF>jUX0wBEEp7g{}1u zsccmQ?FFB}-d+&V#uVBF1jQzbhQ!3JuHbr`i^cAg!_1kP?;Gjyc<@QcA9eob== zB$G)tn+-t_5QZV=^BGx|DV0i0r&Da(X1CitHF$HO-END;Vu58@NRmVth9nXRB9RD& oVK5$#U#xrs{BQjHD}N050;n^il~|F~asU7T07*qoM6N<$f&nPR(*OVf diff --git a/tools/TreeModel/icons/item_visible.png b/tools/TreeModel/icons/item_visible.png deleted file mode 100644 index e0bbf75fc83a46998487ec0a32782619b5775550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmV<40U`d0P)zlEF)waTv!xzjrxXy-gxWL>MI!1hqmCZykc+cIgm! z*v+f{1s*&IzTjcv#fyjj0Ab#?4tDNPMDeB_f{<+*jhMF0sl}`I>@X(VT10r*p5p`0 z=lMR*_p3yNVM-fn`o92-{H>YG<)mCLQ#)_*<=Yic=VzImu#rqA)tw4Lp^$t$zd)t} z%=p%M>!>i>lFR z5RFFV2Egz4OE?_H>-DP9v2nVcI?b~qoQ@G%pQ~KllLEL zG@2H(OD|ZSo95>-(=;(nQ+YfdrG8CfEEW@&%f - - icons/treeview_and.png - icons/treeview_or.png - icons/treeview_update.png - - diff --git a/tools/VInspector/VInspector_Communicator.cxx b/tools/VInspector/VInspector_Communicator.cxx deleted file mode 100644 index 46a10c953f..0000000000 --- a/tools/VInspector/VInspector_Communicator.cxx +++ /dev/null @@ -1,48 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : CreateCommunicator -// purpose : Creates a communicator by the library loading -// ======================================================================= -Standard_EXPORTEXTERNC TInspectorAPI_Communicator* CreateCommunicator() -{ - return new VInspector_Communicator(); -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -VInspector_Communicator::VInspector_Communicator() - : TInspectorAPI_Communicator(), - myWindow(0) -{ - myWindow = new VInspector_Window(); -} diff --git a/tools/VInspector/VInspector_Communicator.hxx b/tools/VInspector/VInspector_Communicator.hxx deleted file mode 100644 index b96ba380ac..0000000000 --- a/tools/VInspector/VInspector_Communicator.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_Communicator_H -#define VInspector_Communicator_H - -#include -#include -#include - -#include - -//! \class VInspector_Communicator. -//! \brief This is a connector from TInspector application to VInspector view -class VInspector_Communicator : public TInspectorAPI_Communicator -{ -public: - //! Constructor - Standard_EXPORT VInspector_Communicator(); - - //! Destructor - virtual ~VInspector_Communicator() {} - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - virtual void SetParent(void* theParent) Standard_OVERRIDE { myWindow->SetParent(theParent); } - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - virtual void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - Standard_OVERRIDE - { - myWindow->SetParameters(theParameters); - } - - //! Provide container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE - { - myWindow->FillActionsMenu(theMenu); - } - - //! Returns plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->GetPreferences(theItem); - } - - //! Stores plugin preferences, empty implementation by default - //! \param theItem container of preference elements - virtual void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE - { - myWindow->SetPreferences(theItem); - } - - //! Calls update of the plugin's content - virtual void UpdateContent() Standard_OVERRIDE { myWindow->UpdateContent(); } - -private: - VInspector_Window* myWindow; //!< current window -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemBase.cxx b/tools/VInspector/VInspector_ItemBase.cxx deleted file mode 100644 index b7b105c412..0000000000 --- a/tools/VInspector/VInspector_ItemBase.cxx +++ /dev/null @@ -1,93 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemBase::Reset() -{ - myPresentationShape = TopoDS_Shape(); - TreeModel_ItemBase::Reset(); -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemBase::initValue(const int theItemRole) const -{ - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole) - return QVariant(); - - switch (Column()) - { - case 3: - return Standard_Dump::GetPointerInfo(Object(), true).ToCString(); - } - - return TreeModel_ItemBase::initValue(theItemRole); -} - -// ======================================================================= -// function : GetContext -// purpose : -// ======================================================================= -Handle(AIS_InteractiveContext) VInspector_ItemBase::GetContext() const -{ - if (!myContext.IsNull()) - return myContext; - - Handle(AIS_InteractiveContext) aContext; - if (dynamic_cast(this)) - { - return Handle(AIS_InteractiveContext)(); // context has not be set yet - } - else - { - TreeModel_ItemBasePtr anItem = Parent(); - while (anItem) - { - if (VInspector_ItemContextPtr aContextItem = itemDynamicCast(anItem)) - { - aContext = aContextItem->GetContext(); - break; - } - anItem = anItem->Parent(); - } - } - if (!aContext.IsNull()) - const_cast(this)->SetContext(aContext); - - return myContext; -} - -// ======================================================================= -// function : GetContext -// purpose : -// ======================================================================= -TopoDS_Shape VInspector_ItemBase::GetPresentationShape() const -{ - if (Column() != TreeModel_ColumnType_Name) - return TopoDS_Shape(); - - initItem(); - return myPresentationShape; -} diff --git a/tools/VInspector/VInspector_ItemBase.hxx b/tools/VInspector/VInspector_ItemBase.hxx deleted file mode 100644 index 9033063c2e..0000000000 --- a/tools/VInspector/VInspector_ItemBase.hxx +++ /dev/null @@ -1,87 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemBase_H -#define VInspector_ItemBase_H - -#include -#include -#include - -#include -#include - -class VInspector_ItemBase; -typedef QExplicitlySharedDataPointer VInspector_ItemBasePtr; - -//! \class VInspector_ItemBase -//! Parent item for all ShapeView items -class VInspector_ItemBase : public TreeModel_ItemBase -{ -public: - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Sets the context - //! \param theLabel an object where the child items structure is found - void SetContext(const Handle(AIS_InteractiveContext)& theContext) { myContext = theContext; } - - //! Returns true if the current context is not null - //! \return a boolean value - bool HasContext() const { return !GetContext().IsNull(); } - - //! Returns the current context. It iterates up by list of parents to found context item and - //! return context \return a context - Standard_EXPORT Handle(AIS_InteractiveContext) GetContext() const; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Returns transform persistent of the item or NULL - Handle(Graphic3d_TransformPers) TransformPersistence() const { return myTransformPersistence; } - - //! Returns shape of the item parameters - //! \return generated shape of the item parameters - Standard_EXPORT virtual TopoDS_Shape GetPresentationShape() const; - - //! Rebuild presentation shape if the item use it - //! \return generated shape of the item parameters - void UpdatePresentationShape() { myPresentationShape = buildPresentationShape(); } - -protected: - //! Build presentation shape - //! \return generated shape of the item parameters - virtual TopoDS_Shape buildPresentationShape() { return TopoDS_Shape(); } - -protected: - //! Constructor - //! \param theParent a parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - VInspector_ItemBase(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : TreeModel_ItemBase(theParent, theRow, theColumn), - myContext(0) - { - } - -protected: - Handle(AIS_InteractiveContext) myContext; //!< the current context - TopoDS_Shape myPresentationShape; //!< item presentation shape - Handle(Graphic3d_TransformPers) myTransformPersistence; //!< item cached persistent -}; - -#endif \ No newline at end of file diff --git a/tools/VInspector/VInspector_ItemContext.cxx b/tools/VInspector/VInspector_ItemContext.cxx deleted file mode 100644 index 0f1294205c..0000000000 --- a/tools/VInspector/VInspector_ItemContext.cxx +++ /dev/null @@ -1,150 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemContext::initRowCount() const -{ - if (Column() != 0) - return 0; - - int aNbProperties = 1; // item to visualize Viewer information of context - - Handle(AIS_InteractiveContext) aContext = Handle(AIS_InteractiveContext)::DownCast(Object()); - if (aContext.IsNull()) - return 0; - - AIS_ListOfInteractive aListOfIO; - aContext->DisplayedObjects(aListOfIO); - aContext->ErasedObjects(aListOfIO); - int aNbPresentations = 0; - for (AIS_ListIteratorOfListOfInteractive aListOfIOIt(aListOfIO); aListOfIOIt.More(); - aListOfIOIt.Next()) - { - if (aListOfIOIt.Value()->Parent()) - continue; // child presentation - aNbPresentations++; - } - - return aNbProperties + aNbPresentations; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemContext::initValue(const int theItemRole) const -{ - QVariant aParentValue = VInspector_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole - && theItemRole != Qt::ToolTipRole) - return QVariant(); - - Handle(AIS_InteractiveContext) aContext = Handle(AIS_InteractiveContext)::DownCast(Object()); - if (aContext.IsNull()) - return Column() == 0 ? "Empty context" : ""; - - switch (Column()) - { - case 0: - return aContext->DynamicType()->Name(); - case 4: { - Handle(AIS_InteractiveObject) anEmptyIO; - int aSelectedCount = VInspector_Tools::SelectedOwners(aContext, anEmptyIO, false); - return aSelectedCount > 0 ? QString::number(aSelectedCount) : ""; - } - case 6: - return aContext->DeviationCoefficient(); - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemContext::Init() -{ - Handle(AIS_InteractiveContext) aContext = GetContext(); - if (aContext.IsNull()) - return; - - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemContext::Reset() -{ - VInspector_ItemBase::Reset(); -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemContext::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr VInspector_ItemContext::createChild(int theRow, int theColumn) -{ - if (theRow == 0) - return VInspector_ItemContextProperties::CreateItem(currentItem(), theRow, theColumn); - else - return VInspector_ItemPresentableObject::CreateItem(currentItem(), theRow, theColumn); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void VInspector_ItemContext::initStream(Standard_OStream& theOStream) const -{ - Handle(AIS_InteractiveContext) aContext = GetContext(); - if (aContext.IsNull()) - return; - - aContext->DumpJson(theOStream); -} diff --git a/tools/VInspector/VInspector_ItemContext.hxx b/tools/VInspector/VInspector_ItemContext.hxx deleted file mode 100644 index 4bb7165083..0000000000 --- a/tools/VInspector/VInspector_ItemContext.hxx +++ /dev/null @@ -1,94 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemContext_H -#define VInspector_ItemContext_H - -#include -#include - -class VInspector_ItemContext; -typedef QExplicitlySharedDataPointer VInspector_ItemContextPtr; - -//! \class VInspector_ItemContext -//! Parent item, that corresponds to AIS_InteractiveContext -//! Children of the item are: -//! - "Property" item to show context attributes such as selection filters and drawer properties -//! - presentation items to show all interactive elements displayed/erased in the context -class VInspector_ItemContext : public VInspector_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static VInspector_ItemContextPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return VInspector_ItemContextPtr(new VInspector_ItemContext(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~VInspector_ItemContext() {} - - //! Returns data object of the item. - //! \return object - virtual const Handle(Standard_Transient)& Object() const Standard_OVERRIDE - { - initItem(); - return myContext; - } - - //! Returns number of displayed presentations - //! \return rows count - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - -protected: - //! Initializes the current item. It creates a backup of the specific item information - //! Does nothing as context has been already set into item - virtual void initItem() const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - -protected: - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! \param theParent a parent item - //! \param theRow the item row position in the parent item - //! \param theColumn the item column position in the parent item - VInspector_ItemContext(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) - { - } -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemContextProperties.cxx b/tools/VInspector/VInspector_ItemContextProperties.cxx deleted file mode 100644 index ba1422228f..0000000000 --- a/tools/VInspector/VInspector_ItemContextProperties.cxx +++ /dev/null @@ -1,93 +0,0 @@ -// Created on: 2020-02-10 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include -#include - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemContextProperties::initValue(int theItemRole) const -{ - QVariant aParentValue = VInspector_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)) - return QVariant(); - - return "Properties"; -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemContextProperties::initRowCount() const -{ - int aLightsCount = 0; - - VInspector_ItemContextPtr aParentContextItem = itemDynamicCast(Parent()); - if (aParentContextItem) - { - Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); - Handle(V3d_Viewer) aViewer = aContext->CurrentViewer(); - if (!aViewer.IsNull()) - { - if (!aViewer->ActiveViews().IsEmpty()) - { - Handle(V3d_View) aView = aViewer->ActiveViews().First(); - if (!aView.IsNull()) - aLightsCount = aView->ActiveLights().Extent(); - } - } - } - return 2 + aLightsCount; // V3d_Viewer, SelectMgr_ViewerSelector -} - -// ======================================================================= -// function : createChild -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr VInspector_ItemContextProperties::createChild(int theRow, int theColumn) -{ - if (theRow == 0) - return VInspector_ItemV3dViewer::CreateItem(currentItem(), theRow, theColumn); - else if (theRow == 1) - return VInspector_ItemSelectMgrViewerSelector::CreateItem(currentItem(), theRow, theColumn); - else // lights - { - return VInspector_ItemGraphic3dCLight::CreateItem(currentItem(), theRow, theColumn); - } -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemContextProperties::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} diff --git a/tools/VInspector/VInspector_ItemContextProperties.hxx b/tools/VInspector/VInspector_ItemContextProperties.hxx deleted file mode 100644 index 9cc003d1aa..0000000000 --- a/tools/VInspector/VInspector_ItemContextProperties.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// Created on: 2020-02-10 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemContextProperties_H -#define VInspector_ItemContextProperties_H - -#include -#include - -#include -#include - -class VInspector_ItemContextProperties; -typedef QExplicitlySharedDataPointer - VInspector_ItemContextPropertiesPtr; - -//! \class VInspector_ItemContextProperties -//! Item presents additional level of information in the tree model. -//! Parent is item context, child is v3d viewer item. -class VInspector_ItemContextProperties : public VInspector_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static VInspector_ItemContextPropertiesPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return VInspector_ItemContextPropertiesPtr( - new VInspector_ItemContextProperties(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~VInspector_ItemContextProperties() Standard_OVERRIDE {}; - -protected: - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Returns number of item selected - //! \return rows count - virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Creates a child item in the given position. - //! \param theRow the child row position - //! \param theColumn the child column position - //! \return the created item - virtual TreeModel_ItemBasePtr createChild(int theRow, int theColumn) Standard_OVERRIDE; - -private: - //! Constructor - //! param theParent a parent item - VInspector_ItemContextProperties(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) - { - } -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemGraphic3dCLight.cxx b/tools/VInspector/VInspector_ItemGraphic3dCLight.cxx deleted file mode 100644 index e37005063e..0000000000 --- a/tools/VInspector/VInspector_ItemGraphic3dCLight.cxx +++ /dev/null @@ -1,245 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -#include -#include - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemGraphic3dCLight::initRowCount() const -{ - return 0; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemGraphic3dCLight::initValue(const int theItemRole) const -{ - QVariant aParentValue = VInspector_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (theItemRole == Qt::ForegroundRole) - { - if (GetLight().IsNull()) - return QVariant(); - - if (!GetLight()->IsEnabled()) - return QColor(Qt::darkGray); - - return QVariant(); - } - - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole - && theItemRole != Qt::ToolTipRole) - return QVariant(); - - if (GetLight().IsNull()) - return Column() == 0 ? "Empty light" : ""; - - if (Column() != 0) - return QVariant(); - - switch (GetLight()->Type()) - { - case Graphic3d_TOLS_AMBIENT: - return "Ambient light"; - case Graphic3d_TOLS_DIRECTIONAL: - return "Directional light"; - case Graphic3d_TOLS_POSITIONAL: - return "Positional light"; - case Graphic3d_TOLS_SPOT: - return "Spot light"; - default: - break; - } - return QVariant(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemGraphic3dCLight::Init() -{ - VInspector_ItemContextPropertiesPtr aParentItem = - itemDynamicCast(Parent()); - Handle(Graphic3d_CLight) aLight; - if (aParentItem) - { - VInspector_ItemContextPtr aParentContextItem = - itemDynamicCast(aParentItem->Parent()); - if (aParentContextItem) - { - Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); - Handle(V3d_Viewer) aViewer = aContext->CurrentViewer(); - if (!aViewer.IsNull()) - { - int aLightId = Row() - 2 /*in parent*/; - int aCurrentId = 0; - for (V3d_ListOfLightIterator aLightsIt(aViewer->ActiveLightIterator()); aLightsIt.More(); - aLightsIt.Next(), aCurrentId++) - { - if (aCurrentId != aLightId) - continue; - aLight = aLightsIt.Value(); - } - } - } - } - myLight = aLight; - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemGraphic3dCLight::Reset() -{ - VInspector_ItemBase::Reset(); - - myLight = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemGraphic3dCLight::StoreItemProperties(const int theRow, - const int theColumn, - const QVariant& theValue) -{ - if (myLight.IsNull()) - return; - - const Handle(TreeModel_ItemProperties)& aProperties = Properties(); - if (theRow == -1 && theColumn == -1) // processing sub-item value - { - Standard_SStream aStream; - aStream << theValue.toString().toStdString().c_str(); - - int aStartPos = 1; - Quantity_ColorRGBA aColor; - if (aColor.InitFromJson(aStream, aStartPos)) - { - myLight->SetColor(aColor.GetRGB()); - return; - } - - // "Direction" - gp_Dir aDir; - if (aDir.InitFromJson(aStream, aStartPos)) - { - myLight->SetDirection(aDir); - return; - } - - // "Position" - gp_Pnt aPnt; - if (aPnt.InitFromJson(aStream, aStartPos)) - { - myLight->SetPosition(aPnt); - return; - } - } - - QString aPropertyName = aProperties->Data(theRow, 0).toString(); - QVariant aPropertyValue = aProperties->Data(theRow, 1); - if (aPropertyName == "Position") - { - } - else if (aPropertyName == "Intensity") - { - myLight->SetIntensity((Standard_ShortReal)aPropertyValue.toReal()); - } - else if (aPropertyName == "ConstAttenuation") - { - myLight->SetAttenuation((Standard_ShortReal)aPropertyValue.toReal(), - (Standard_ShortReal)aProperties->Data(theRow + 1, 1).toReal()); - } - else if (aPropertyName == "LinearAttenuation") - { - myLight->SetAttenuation((Standard_ShortReal)aProperties->Data(theRow - 1, 1).toReal(), - (Standard_ShortReal)aPropertyValue.toReal()); - } - else if (aPropertyName == "Angle") - { - myLight->SetAngle((Standard_ShortReal)aPropertyValue.toReal()); - } - else if (aPropertyName == "Concentration") - { - myLight->SetConcentration((Standard_ShortReal)aPropertyValue.toReal()); - } - else if (aPropertyName == "Range") - { - myLight->SetRange((Standard_ShortReal)aPropertyValue.toReal()); - } - else if (aPropertyName == "Smoothness") - { - if (myLight->Type() == Graphic3d_TOLS_DIRECTIONAL) - { - myLight->SetSmoothAngle((Standard_ShortReal)aPropertyValue.toReal()); - } - else - { - myLight->SetSmoothRadius((Standard_ShortReal)aPropertyValue.toReal()); - } - } - else if (aPropertyName == "IsHeadlight") - { - myLight->SetHeadlight(aPropertyValue.toInt() == 1); - } - else if (aPropertyName == "IsEnabled") - { - myLight->SetEnabled(aPropertyValue.toInt() == 1); - } -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemGraphic3dCLight::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void VInspector_ItemGraphic3dCLight::initStream(Standard_OStream& theOStream) const -{ - Handle(Graphic3d_CLight) aLight = GetLight(); - if (aLight.IsNull()) - return; - - aLight->DumpJson(theOStream); -} diff --git a/tools/VInspector/VInspector_ItemGraphic3dCLight.hxx b/tools/VInspector/VInspector_ItemGraphic3dCLight.hxx deleted file mode 100644 index 9b30d0923a..0000000000 --- a/tools/VInspector/VInspector_ItemGraphic3dCLight.hxx +++ /dev/null @@ -1,101 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemGraphic3dCLight_H -#define VInspector_ItemGraphic3dCLight_H - -#include -#include - -#include - -class VInspector_ItemGraphic3dCLight; -typedef QExplicitlySharedDataPointer - VInspector_ItemGraphic3dCLightPtr; - -//! \class VInspector_ItemGraphic3dCLight -//! Parent item is context properties, that corresponds to AIS_InteractiveContext -class VInspector_ItemGraphic3dCLight : public VInspector_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static VInspector_ItemGraphic3dCLightPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return VInspector_ItemGraphic3dCLightPtr( - new VInspector_ItemGraphic3dCLight(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~VInspector_ItemGraphic3dCLight() Standard_OVERRIDE {}; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns data object of the item. - //! \return object - virtual const Handle(Standard_Transient)& Object() const Standard_OVERRIDE - { - initItem(); - return myLight; - } - - //! Returns the current light, init item if it was not initialized yet - //! \return interactive object - Handle(Graphic3d_CLight) GetLight() const { return Handle(Graphic3d_CLight)::DownCast(Object()); } - - //! Updates item by the item properties value - virtual void StoreItemProperties(const int theRow, - const int theColumn, - const QVariant& theValue) Standard_OVERRIDE; - -protected: - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Returns number of displayed presentations - //! \return rows count - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - -private: - //! Constructor - //! param theParent a parent item - //! \param theRow the item row positition in the parent item - //! \param theColumn the item column positition in the parent item - VInspector_ItemGraphic3dCLight(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) - { - } - -protected: - Handle(Graphic3d_CLight) myLight; //!< the current light -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemPresentableObject.cxx b/tools/VInspector/VInspector_ItemPresentableObject.cxx deleted file mode 100644 index a711e5e9bc..0000000000 --- a/tools/VInspector/VInspector_ItemPresentableObject.cxx +++ /dev/null @@ -1,252 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemPresentableObject::initValue(int theItemRole) const -{ - QVariant aParentValue = VInspector_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole) - { - Handle(AIS_InteractiveObject) anIO = GetInteractiveObject(); - bool aNullIO = anIO.IsNull(); - switch (Column()) - { - case 0: { - if (aNullIO) - return theItemRole == Qt::ToolTipRole ? QVariant("Owners where Selectable is empty") - : QVariant("Free Owners"); - else - return theItemRole == Qt::ToolTipRole ? QVariant("") - : QVariant(anIO->DynamicType()->Name()); - } - case 4: { - int aNbSelected = VInspector_Tools::SelectedOwners(GetContext(), anIO, false); - return aNbSelected > 0 ? QString::number(aNbSelected) : ""; - } - case 6: { - double aDeviationCoefficient = 0; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anIO); - if (!anAISShape.IsNull()) - { - Standard_Real aPreviousCoefficient; - anAISShape->OwnDeviationCoefficient(aDeviationCoefficient, aPreviousCoefficient); - } - return QString::number(aDeviationCoefficient); - } - case 8: { - double aDeviationCoefficient = 0; - Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anIO); - if (!anAISShape.IsNull()) - { - Standard_Real aPreviousCoefficient; - anAISShape->OwnDeviationCoefficient(aDeviationCoefficient, aPreviousCoefficient); - } - Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast(anIO); - bool anIsAutoTriangulation = aNullIO ? false : anIO->Attributes()->IsAutoTriangulation(); - return anIsAutoTriangulation ? QString("true") : QString("false"); - } - default: - break; - } - } - if (theItemRole == Qt::BackgroundRole || theItemRole == Qt::ForegroundRole) - { - Handle(AIS_InteractiveContext) aContext = GetContext(); - if (Column() == 2 - && VInspector_Tools::SelectedOwners(aContext, GetInteractiveObject(), false) > 0) - { - return (theItemRole == Qt::BackgroundRole) ? QColor(Qt::darkBlue) : QColor(Qt::white); - } - else if (theItemRole == Qt::ForegroundRole) - { - Handle(AIS_InteractiveObject) anIO = GetInteractiveObject(); - if (anIO.IsNull()) - return QVariant(); - - AIS_ListOfInteractive aListOfIO; - GetContext()->ErasedObjects(aListOfIO); - for (AIS_ListIteratorOfListOfInteractive anIOIt(aListOfIO); anIOIt.More(); anIOIt.Next()) - { - if (anIO == anIOIt.Value()) - return QColor(Qt::darkGray); - } - return QColor(Qt::black); - } - } - return QVariant(); -} - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemPresentableObject::initRowCount() const -{ - return 0; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemPresentableObject::Init() -{ - VInspector_ItemContextPtr aParentItem = itemDynamicCast(Parent()); - Handle(AIS_InteractiveContext) aContext = aParentItem->GetContext(); - SetContext(aContext); - - Handle(AIS_InteractiveObject) anIO; - if (!GetContext().IsNull()) - { - int aRowId = Row(); - AIS_ListOfInteractive aListOfIO; - GetContext()->DisplayedObjects( - aListOfIO); // the presentation is in displayed objects of Context - GetContext()->ErasedObjects(aListOfIO); // the presentation is in erased objects of Context - - std::vector aListOfIOSorted; - aListOfIOSorted.reserve(aListOfIO.Size()); - for (AIS_ListIteratorOfListOfInteractive anIOIt(aListOfIO); anIOIt.More(); anIOIt.Next()) - { - aListOfIOSorted.push_back(anIOIt.Value()); - } - std::sort(aListOfIOSorted.begin(), aListOfIOSorted.end()); - - int aCurrentIndex = 1; /* Properties item of context*/ - for (std::vector::const_iterator anIOIt = - aListOfIOSorted.begin(); - anIOIt != aListOfIOSorted.end(); - anIOIt++, aCurrentIndex++) - { - if (aCurrentIndex != aRowId) - continue; - anIO = *anIOIt; - break; - } - } - - setInteractiveObject(anIO); - myTransformPersistence = !anIO.IsNull() ? anIO->TransformPersistence() : NULL; - UpdatePresentationShape(); - TreeModel_ItemBase::Init(); // to use getIO() without circling initialization -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemPresentableObject::Reset() -{ - VInspector_ItemBase::Reset(); - - SetContext(NULL); - setInteractiveObject(NULL); - myTransformPersistence = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemPresentableObject::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : buildPresentationShape -// purpose : -// ======================================================================= -TopoDS_Shape VInspector_ItemPresentableObject::buildPresentationShape() -{ - Handle(AIS_InteractiveObject) aPrs = myIO; - if (aPrs.IsNull()) - return TopoDS_Shape(); - - Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aPrs); - if (!aShapePrs.IsNull()) - return aShapePrs->Shape(); - - return TopoDS_Shape(); -} - -// ======================================================================= -// function : PointerInfo -// purpose : -// ======================================================================= -QString VInspector_ItemPresentableObject::PointerInfo() const -{ - return Standard_Dump::GetPointerInfo(GetInteractiveObject(), true).ToCString(); -} - -// ======================================================================= -// function : Presentations -// purpose : -// ======================================================================= -void VInspector_ItemPresentableObject::Presentations( - NCollection_List& thePresentations) -{ - TreeModel_ItemBase::Presentations(thePresentations); - - if (Column() != 0) - return; - thePresentations.Append(GetInteractiveObject()); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void VInspector_ItemPresentableObject::initStream(Standard_OStream& theOStream) const -{ - Handle(AIS_InteractiveObject) anIO = GetInteractiveObject(); - if (anIO.IsNull()) - return; - - anIO->DumpJson(theOStream); -} diff --git a/tools/VInspector/VInspector_ItemPresentableObject.hxx b/tools/VInspector/VInspector_ItemPresentableObject.hxx deleted file mode 100644 index 7d0340c9b4..0000000000 --- a/tools/VInspector/VInspector_ItemPresentableObject.hxx +++ /dev/null @@ -1,120 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemPresentableObject_H -#define VInspector_ItemPresentableObject_H - -#include -#include - -#include -#include - -class QItemSelectionModel; - -class VInspector_ItemPresentableObject; -typedef QExplicitlySharedDataPointer - VInspector_ItemPresentableObjectPtr; - -//! \class VInspector_ItemPresentableObject -//! Item presents information about AIS_InteractiveObject. -//! Parent is item context, children are item selections. -class VInspector_ItemPresentableObject : public VInspector_ItemBase -{ - -public: - //! Creates an item wrapped by a shared pointer - static VInspector_ItemPresentableObjectPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return VInspector_ItemPresentableObjectPtr( - new VInspector_ItemPresentableObject(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~VInspector_ItemPresentableObject() {} - - //! Returns data object of the item. - //! \return object - virtual const Handle(Standard_Transient)& Object() const Standard_OVERRIDE - { - initItem(); - return myIO; - } - - //! Returns the current interactive object, init item if it was not initialized yet - //! \return interactive object - Handle(AIS_InteractiveObject) GetInteractiveObject() const - { - return Handle(AIS_InteractiveObject)::DownCast(Object()); - } - - //! Returns pointer information for the current interactive object, init item if it was not - //! initialized yet \return string value - Standard_EXPORT QString PointerInfo() const; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns presentation of the attribute to be visualized in the view - //! \thePresentations[out] container of presentation handles to be visualized - Standard_EXPORT virtual void Presentations( - NCollection_List& thePresentations) Standard_OVERRIDE; - -protected: - //! Initialize the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Returns number of item selected - //! \return rows count - virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - -protected: - //! Build presentation shape - //! \return generated shape of the item parameters - virtual TopoDS_Shape buildPresentationShape() Standard_OVERRIDE; - - //! Set interactive object into the current field - //! \param theIO a presentation - void setInteractiveObject(Handle(AIS_InteractiveObject) theIO) { myIO = theIO; } - -private: - //! Constructor - //! \param theParent a parent item - VInspector_ItemPresentableObject(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) - { - } - -protected: - Handle(AIS_InteractiveObject) myIO; //!< the current interactive context -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx b/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx deleted file mode 100644 index 975e102f28..0000000000 --- a/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.cxx +++ /dev/null @@ -1,108 +0,0 @@ -// Created on: 2020-02-10 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemSelectMgrViewerSelector::initRowCount() const -{ - return 0; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemSelectMgrViewerSelector::initValue(const int theItemRole) const -{ - QVariant aParentValue = VInspector_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole - && theItemRole != Qt::ToolTipRole) - return QVariant(); - - if (GetViewerSelector().IsNull()) - return Column() == 0 ? "Empty viewer selector" : ""; - - return Column() == 0 ? GetViewerSelector()->DynamicType()->Name() : QVariant(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemSelectMgrViewerSelector::Init() -{ - VInspector_ItemContextPropertiesPtr aParentItem = - itemDynamicCast(Parent()); - Handle(SelectMgr_ViewerSelector) aViewerSelector; - if (aParentItem) - { - VInspector_ItemContextPtr aParentContextItem = - itemDynamicCast(aParentItem->Parent()); - if (aParentContextItem) - { - Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); - aViewerSelector = aContext->MainSelector(); - } - } - myViewerSelector = aViewerSelector; - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemSelectMgrViewerSelector::Reset() -{ - VInspector_ItemBase::Reset(); - - myViewerSelector = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemSelectMgrViewerSelector::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void VInspector_ItemSelectMgrViewerSelector::initStream(Standard_OStream& theOStream) const -{ - Handle(SelectMgr_ViewerSelector) aViewerSelector = GetViewerSelector(); - if (aViewerSelector.IsNull()) - return; - - aViewerSelector->DumpJson(theOStream); -} diff --git a/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx b/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx deleted file mode 100644 index 59bc7ce907..0000000000 --- a/tools/VInspector/VInspector_ItemSelectMgrViewerSelector.hxx +++ /dev/null @@ -1,99 +0,0 @@ -// Created on: 2020-02-10 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemSelectMgrViewerSelector_H -#define VInspector_ItemSelectMgrViewerSelector_H - -#include -#include - -#include - -class VInspector_ItemSelectMgrViewerSelector; -typedef QExplicitlySharedDataPointer - VInspector_ItemSelectMgrViewerSelectorPtr; - -//! \class VInspector_ItemSelectMgrViewerSelector -//! Parent item is context properties, that corresponds to SelectMgr_ViewerSelector -class VInspector_ItemSelectMgrViewerSelector : public VInspector_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static VInspector_ItemSelectMgrViewerSelectorPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return VInspector_ItemSelectMgrViewerSelectorPtr( - new VInspector_ItemSelectMgrViewerSelector(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~VInspector_ItemSelectMgrViewerSelector() Standard_OVERRIDE {}; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns data object of the item. - //! \return object - virtual const Handle(Standard_Transient)& Object() const Standard_OVERRIDE - { - initItem(); - return myViewerSelector; - } - - //! Returns the current viewer, init item if it was not initialized yet - //! \return interactive object - Handle(SelectMgr_ViewerSelector) GetViewerSelector() const - { - return Handle(SelectMgr_ViewerSelector)::DownCast(Object()); - } - -protected: - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Returns number of displayed presentations - //! \return rows count - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - -private: - //! Constructor - //! param theParent a parent item - //! \param theRow the item row positition in the parent item - //! \param theColumn the item column positition in the parent item - VInspector_ItemSelectMgrViewerSelector(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) - { - } - -protected: - Handle(SelectMgr_ViewerSelector) myViewerSelector; //!< the current viewer selector -}; - -#endif diff --git a/tools/VInspector/VInspector_ItemV3dViewer.cxx b/tools/VInspector/VInspector_ItemV3dViewer.cxx deleted file mode 100644 index 54f698b38a..0000000000 --- a/tools/VInspector/VInspector_ItemV3dViewer.cxx +++ /dev/null @@ -1,108 +0,0 @@ -// Created on: 2020-02-10 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : initRowCount -// purpose : -// ======================================================================= -int VInspector_ItemV3dViewer::initRowCount() const -{ - return 0; -} - -// ======================================================================= -// function : initValue -// purpose : -// ======================================================================= -QVariant VInspector_ItemV3dViewer::initValue(const int theItemRole) const -{ - QVariant aParentValue = VInspector_ItemBase::initValue(theItemRole); - if (aParentValue.isValid()) - return aParentValue; - - if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole - && theItemRole != Qt::ToolTipRole) - return QVariant(); - - if (GetViewer().IsNull()) - return Column() == 0 ? "Empty viewer" : ""; - - return Column() == 0 ? GetViewer()->DynamicType()->Name() : QVariant(); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void VInspector_ItemV3dViewer::Init() -{ - VInspector_ItemContextPropertiesPtr aParentItem = - itemDynamicCast(Parent()); - Handle(V3d_Viewer) aViewer; - if (aParentItem) - { - VInspector_ItemContextPtr aParentContextItem = - itemDynamicCast(aParentItem->Parent()); - if (aParentContextItem) - { - Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext(); - aViewer = aContext->CurrentViewer(); - } - } - myViewer = aViewer; - TreeModel_ItemBase::Init(); -} - -// ======================================================================= -// function : Reset -// purpose : -// ======================================================================= -void VInspector_ItemV3dViewer::Reset() -{ - VInspector_ItemBase::Reset(); - - myViewer = NULL; -} - -// ======================================================================= -// function : initItem -// purpose : -// ======================================================================= -void VInspector_ItemV3dViewer::initItem() const -{ - if (IsInitialized()) - return; - const_cast(this)->Init(); -} - -// ======================================================================= -// function : initStream -// purpose : -// ======================================================================= -void VInspector_ItemV3dViewer::initStream(Standard_OStream& theOStream) const -{ - Handle(V3d_Viewer) aViewer = GetViewer(); - if (aViewer.IsNull()) - return; - - aViewer->DumpJson(theOStream); -} diff --git a/tools/VInspector/VInspector_ItemV3dViewer.hxx b/tools/VInspector/VInspector_ItemV3dViewer.hxx deleted file mode 100644 index e9ca2b46bf..0000000000 --- a/tools/VInspector/VInspector_ItemV3dViewer.hxx +++ /dev/null @@ -1,92 +0,0 @@ -// Created on: 2020-02-10 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ItemV3dViewer_H -#define VInspector_ItemV3dViewer_H - -#include -#include - -#include - -class VInspector_ItemV3dViewer; -typedef QExplicitlySharedDataPointer VInspector_ItemV3dViewerPtr; - -//! \class VInspector_ItemV3dViewer -//! Parent item is context properties, that corresponds to AIS_InteractiveContext -class VInspector_ItemV3dViewer : public VInspector_ItemBase -{ -public: - //! Creates an item wrapped by a shared pointer - static VInspector_ItemV3dViewerPtr CreateItem(TreeModel_ItemBasePtr theParent, - const int theRow, - const int theColumn) - { - return VInspector_ItemV3dViewerPtr(new VInspector_ItemV3dViewer(theParent, theRow, theColumn)); - } - - //! Destructor - virtual ~VInspector_ItemV3dViewer() Standard_OVERRIDE {}; - - //! Inits the item, fills internal containers - Standard_EXPORT virtual void Init() Standard_OVERRIDE; - - //! Resets cached values - Standard_EXPORT virtual void Reset() Standard_OVERRIDE; - - //! Returns data object of the item. - //! \return object - virtual const Handle(Standard_Transient)& Object() const Standard_OVERRIDE - { - initItem(); - return myViewer; - } - - //! Returns the current viewer, init item if it was not initialized yet - //! \return interactive object - Handle(V3d_Viewer) GetViewer() const { return Handle(V3d_Viewer)::DownCast(Object()); } - -protected: - //! Initializes the current item. It is empty because Reset() is also empty. - virtual void initItem() const Standard_OVERRIDE; - - //! Returns number of displayed presentations - //! \return rows count - Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE; - - //! Returns item information for the given role. Fills internal container if it was not filled yet - //! \param theItemRole a value role - //! \return the value - Standard_EXPORT virtual QVariant initValue(const int theItemRole) const Standard_OVERRIDE; - - //! Returns stream value of the item to fulfill property panel. - //! \return stream value or dummy - Standard_EXPORT virtual void initStream(Standard_OStream& theOStream) const Standard_OVERRIDE; - -private: - //! Constructor - //! param theParent a parent item - //! \param theRow the item row positition in the parent item - //! \param theColumn the item column positition in the parent item - VInspector_ItemV3dViewer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn) - : VInspector_ItemBase(theParent, theRow, theColumn) - { - } - -protected: - Handle(V3d_Viewer) myViewer; //!< the current viewer -}; - -#endif diff --git a/tools/VInspector/VInspector_ToolActionType.hxx b/tools/VInspector/VInspector_ToolActionType.hxx deleted file mode 100644 index 203c4b1be6..0000000000 --- a/tools/VInspector/VInspector_ToolActionType.hxx +++ /dev/null @@ -1,27 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ToolActionType_H -#define VInspector_ToolActionType_H - -//! \enum VInspector_ToolActionType -enum VInspector_ToolActionType -{ - VInspector_ToolActionType_NoneId, //!< No action activated - VInspector_ToolActionType_UpdateId //!< Update content of tree view (content of - //!< AIS_InteractiveContext) -}; - -#endif diff --git a/tools/VInspector/VInspector_ToolBar.cxx b/tools/VInspector/VInspector_ToolBar.cxx deleted file mode 100644 index 09adcabe16..0000000000 --- a/tools/VInspector/VInspector_ToolBar.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -VInspector_ToolBar::VInspector_ToolBar(QWidget* theParent) - : QObject(theParent) -{ - myActionsMap[VInspector_ToolActionType_UpdateId] = new QPushButton(theParent); - myActionsMap[VInspector_ToolActionType_UpdateId]->setIcon(QIcon(":/icons/treeview_update.png")); - myActionsMap[VInspector_ToolActionType_UpdateId]->setText(tr("Update Tree Model")); - myActionsMap[VInspector_ToolActionType_UpdateId]->setToolTip(tr("Update Tree Model")); - - myActionsMap[VInspector_ToolActionType_UpdateId]->setText("Update"); - - myMainWindow = new QWidget(theParent); - - QHBoxLayout* aLay = new QHBoxLayout(myMainWindow); - aLay->setMargin(0); - for (QMap::ConstIterator anActionsIt = - myActionsMap.begin(); - anActionsIt != myActionsMap.end(); - anActionsIt++) - { - QPushButton* aBtn = anActionsIt.value(); - connect(aBtn, SIGNAL(clicked()), this, SLOT(onActionClicked())); - aLay->addWidget(aBtn); - } - aLay->addStretch(1); -} - -// ======================================================================= -// function : GetToolButton -// purpose : -// ======================================================================= -QPushButton* VInspector_ToolBar::GetToolButton(const VInspector_ToolActionType& theActionId) const -{ - return myActionsMap.contains(theActionId) ? myActionsMap[theActionId] : 0; -} - -// ======================================================================= -// function : onActionClicked -// purpose : -// ======================================================================= -void VInspector_ToolBar::onActionClicked() -{ - int anId = -1; - QPushButton* aSenderBtn = (QPushButton*)sender(); - - for (QMap::ConstIterator anActionsIt = - myActionsMap.begin(); - anActionsIt != myActionsMap.end(); - anActionsIt++) - { - if (anActionsIt.value() != aSenderBtn) - continue; - anId = anActionsIt.key(); - break; - } - - if (anId != -1) - emit actionClicked(anId); -} diff --git a/tools/VInspector/VInspector_ToolBar.hxx b/tools/VInspector/VInspector_ToolBar.hxx deleted file mode 100644 index 491f6e8593..0000000000 --- a/tools/VInspector/VInspector_ToolBar.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ToolBar_H -#define VInspector_ToolBar_H - -#include -#include -#include - -#include -#include -#include -#include - -class QWidget; -class QPushButton; - -//! \class VInspector_ToolBar -//! Container of View tool bar actions -class VInspector_ToolBar : public QObject -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT VInspector_ToolBar(QWidget* theParent); - - //! Destructor - virtual ~VInspector_ToolBar() {} - - //! Returns main control - QWidget* GetControl() const { return myMainWindow; } - - //! Returns tool button by action index - //! \param theActionId index of action - Standard_EXPORT QPushButton* GetToolButton(const VInspector_ToolActionType& theActionId) const; - -signals: - - //! Signal about action click - //! \param theActionId an action index - void actionClicked(int theActionId); - -private slots: - - //! Provides switch for action. Emits signal about action click - void onActionClicked(); - -private: - QWidget* myMainWindow; //!< the main control - QMap myActionsMap; //!< container of type into button -}; - -#endif diff --git a/tools/VInspector/VInspector_Tools.cxx b/tools/VInspector/VInspector_Tools.cxx deleted file mode 100644 index 1e476899f2..0000000000 --- a/tools/VInspector/VInspector_Tools.cxx +++ /dev/null @@ -1,400 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include - -// ======================================================================= -// function : GetShapeTypeInfo -// purpose : -// ======================================================================= -TCollection_AsciiString VInspector_Tools::GetShapeTypeInfo(const TopAbs_ShapeEnum& theType) -{ - Standard_SStream aSStream; - TopAbs::Print(theType, aSStream); - return aSStream.str().c_str(); -} - -// ======================================================================= -// function : SelectedOwners -// purpose : -// ======================================================================= -int VInspector_Tools::SelectedOwners(const Handle(AIS_InteractiveContext)& theContext, - const Handle(AIS_InteractiveObject)& theObject, - const bool theShapeInfoOnly) -{ - QStringList anObjects; - if (theContext.IsNull()) - return 0; - - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - for (theContext->InitSelected(); theContext->MoreSelected(); theContext->NextSelected()) - { - Handle(SelectMgr_EntityOwner) anOwner = theContext->SelectedOwner(); - if (anOwner.IsNull()) // TODO: check why it is possible - continue; - - if (!theObject.IsNull()) - { - Handle(AIS_InteractiveObject) anOwnerPresentation = - Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); - if (anOwnerPresentation != theObject) - continue; - } - Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(anOwner); - if (theShapeInfoOnly && BROwnr.IsNull()) - continue; - - Standard_Transient* anOwnerPtr = anOwner.get(); - if (aSelectedIds.contains((size_t)anOwnerPtr)) - continue; - aSelectedIds.append((size_t)anOwnerPtr); - - anObjects.append(Standard_Dump::GetPointerInfo(anOwnerPtr, true).ToCString()); - } - return anObjects.size(); -} - -// ======================================================================= -// function : IsOwnerSelected -// purpose : -// ======================================================================= -bool VInspector_Tools::IsOwnerSelected(const Handle(AIS_InteractiveContext)& theContext, - const Handle(SelectMgr_EntityOwner)& theOwner) -{ - bool anIsSelected = false; - for (theContext->InitSelected(); theContext->MoreSelected() && !anIsSelected; - theContext->NextSelected()) - anIsSelected = theContext->SelectedOwner() == theOwner; - return anIsSelected; -} - -// ======================================================================= -// function : ContextOwners -// purpose : -// ======================================================================= -NCollection_List VInspector_Tools::ContextOwners( - const Handle(AIS_InteractiveContext)& theContext) -{ - NCollection_List aResultOwners; - if (theContext.IsNull()) - return aResultOwners; - - AIS_ListOfInteractive aListOfIO; - theContext->DisplayedObjects(aListOfIO); - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - for (AIS_ListIteratorOfListOfInteractive aIt(aListOfIO); aIt.More(); aIt.Next()) - { - Handle(AIS_InteractiveObject) anIO = aIt.Value(); - if (anIO.IsNull()) - continue; - for (SelectMgr_SequenceOfSelection::Iterator aSelIter(anIO->Selections()); aSelIter.More(); - aSelIter.Next()) - { - Handle(SelectMgr_Selection) aSelection = aSelIter.Value(); - if (aSelection.IsNull()) - continue; - for (NCollection_Vector::Iterator aSelEntIter( - aSelection->Entities()); - aSelEntIter.More(); - aSelEntIter.Next()) - { - Handle(SelectMgr_SensitiveEntity) anEntity = aSelEntIter.Value(); - if (anEntity.IsNull()) - continue; - const Handle(Select3D_SensitiveEntity)& aBase = anEntity->BaseSensitive(); - Handle(SelectMgr_EntityOwner) anOwner = aBase->OwnerId(); - Standard_Transient* anOwnerPtr = anOwner.get(); - if (aSelectedIds.contains((size_t)anOwnerPtr)) - continue; - aSelectedIds.append((size_t)anOwnerPtr); - aResultOwners.Append(anOwner); - } - } - } - return aResultOwners; -} - -// ======================================================================= -// function : ActiveOwners -// purpose : -// ======================================================================= -NCollection_List VInspector_Tools::ActiveOwners( - const Handle(AIS_InteractiveContext)& theContext, - NCollection_List& theEmptySelectableOwners) -{ - NCollection_List aResultOwners; - - // only local context is processed: TODO for global context - Handle(AIS_InteractiveContext) aContext = theContext; - if (aContext.IsNull()) - return aResultOwners; - NCollection_List anActiveOwners; - // OCCT BUG:1 - equal pointer owners are appears in the list - aContext->MainSelector()->ActiveOwners(anActiveOwners); - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - Handle(SelectMgr_EntityOwner) anOwner; - for (NCollection_List::Iterator anOwnersIt(anActiveOwners); - anOwnersIt.More(); - anOwnersIt.Next()) - { - anOwner = anOwnersIt.Value(); - if (anOwner.IsNull()) - continue; - - Standard_Transient* anOwnerPtr = anOwner.get(); - if (aSelectedIds.contains((size_t)anOwnerPtr)) - continue; - aSelectedIds.append((size_t)anOwnerPtr); - - aResultOwners.Append(anOwner); - Handle(SelectMgr_SelectableObject) aSelectable = anOwner->Selectable(); - if (aSelectable.IsNull() - || !theContext->IsDisplayed(Handle(AIS_InteractiveObject)::DownCast(aSelectable))) - theEmptySelectableOwners.Append(anOwner); - } - return aResultOwners; -} - -// ======================================================================= -// function : AddOrRemoveSelectedShapes -// purpose : -// ======================================================================= -void VInspector_Tools::AddOrRemoveSelectedShapes( - const Handle(AIS_InteractiveContext)& theContext, - const NCollection_List& theOwners) -{ - // TODO: the next two rows are to be removed later - theContext->UnhilightSelected(false); - theContext->ClearSelected(false); - - theContext->UnhilightSelected(Standard_False); - - for (NCollection_List::Iterator anOwnersIt(theOwners); - anOwnersIt.More(); - anOwnersIt.Next()) - { - Handle(SelectMgr_EntityOwner) anOwner = anOwnersIt.Value(); - theContext->AddOrRemoveSelected(anOwner, Standard_False); - } - theContext->UpdateCurrentViewer(); -} - -// ======================================================================= -// function : AddOrRemovePresentations -// purpose : -// ======================================================================= -void VInspector_Tools::AddOrRemovePresentations( - const Handle(AIS_InteractiveContext)& theContext, - const NCollection_List& thePresentations) -{ - // TODO: the next two rows are to be removed later - theContext->UnhilightSelected(false); - theContext->ClearSelected(false); - - for (NCollection_List::Iterator anIOIt(thePresentations); - anIOIt.More(); - anIOIt.Next()) - theContext->AddOrRemoveSelected(anIOIt.Value(), false); - - theContext->UpdateCurrentViewer(); -} - -// ======================================================================= -// function : GetInfo -// purpose : -// ======================================================================= -QList VInspector_Tools::GetInfo(Handle(AIS_InteractiveObject)& theObject) -{ - QList anInfo; - anInfo.append(theObject->DynamicType()->Name()); - anInfo.append(Standard_Dump::GetPointerInfo(theObject, true).ToCString()); - - Handle(AIS_Shape) aShapeIO = Handle(AIS_Shape)::DownCast(theObject); - if (aShapeIO.IsNull()) - return anInfo; - - const TopoDS_Shape& aShape = aShapeIO->Shape(); - if (!aShape.IsNull()) - anInfo.append(VInspector_Tools::GetShapeTypeInfo(aShape.ShapeType()).ToCString()); - - return anInfo; -} - -// ======================================================================= -// function : GetHighlightInfo -// purpose : -// ======================================================================= -QList VInspector_Tools::GetHighlightInfo(const Handle(AIS_InteractiveContext)& theContext) -{ - QList aValues; - if (theContext.IsNull()) - return aValues; - - QStringList aSelectedNames; - QStringList aSelectedPointers; - QStringList aSelectedTypes; - QStringList aSelectedOwners; - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - for (theContext->InitDetected(); theContext->MoreDetected(); theContext->NextDetected()) - { - Handle(SelectMgr_EntityOwner) anOwner = theContext->DetectedOwner(); - if (anOwner.IsNull()) - continue; - Standard_Transient* anOwnerPtr = anOwner.get(); - if (aSelectedIds.contains((size_t)anOwnerPtr)) - continue; - aSelectedIds.append((size_t)anOwnerPtr); - Handle(AIS_InteractiveObject) anIO = - Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); - if (anIO.IsNull()) - continue; - QList anIOInfo = VInspector_Tools::GetInfo(anIO); - if (anIOInfo.size() == 3) - { - aSelectedNames.append(anIOInfo[0].toString()); - aSelectedPointers.append(anIOInfo[1].toString()); - aSelectedTypes.append(anIOInfo[2].toString()); - } - aSelectedOwners.append(Standard_Dump::GetPointerInfo(anOwnerPtr, true).ToCString()); - } - aValues.append(aSelectedNames.join(", ")); - aValues.append(aSelectedPointers.join(", ")); - aValues.append(aSelectedTypes.join(", ")); - aValues.append(aSelectedOwners.join(", ")); - - return aValues; -} - -// ======================================================================= -// function : GetSelectedInfo -// purpose : -// ======================================================================= -QList VInspector_Tools::GetSelectedInfo(const Handle(AIS_InteractiveContext)& theContext) -{ - QList aValues; - if (theContext.IsNull()) - return aValues; - - QStringList aSelectedNames; - QStringList aSelectedPointers; - QStringList aSelectedTypes; - QStringList aSelectedOwners; - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - for (theContext->InitSelected(); theContext->MoreSelected(); theContext->NextSelected()) - { - Handle(SelectMgr_EntityOwner) anOwner = theContext->SelectedOwner(); - if (anOwner.IsNull()) - continue; - Standard_Transient* anOwnerPtr = anOwner.get(); - if (aSelectedIds.contains((size_t)anOwnerPtr)) - continue; - aSelectedIds.append((size_t)anOwnerPtr); - Handle(AIS_InteractiveObject) anIO = - Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); - if (anIO.IsNull()) - continue; - - QList anIOInfo = VInspector_Tools::GetInfo(anIO); - if (anIOInfo.size() == 3) - { - aSelectedNames.append(anIOInfo[0].toString()); - aSelectedPointers.append(anIOInfo[1].toString()); - aSelectedTypes.append(anIOInfo[2].toString()); - } - aSelectedOwners.append(Standard_Dump::GetPointerInfo(anOwnerPtr, true).ToCString()); - } - aValues.append(aSelectedNames.join(", ")); - aValues.append(aSelectedPointers.join(", ")); - aValues.append(aSelectedTypes.join(", ")); - aValues.append(aSelectedOwners.join(", ")); - return aValues; -} - -// ======================================================================= -// function : GetSelectedInfoPointers -// purpose : -// ======================================================================= -QString VInspector_Tools::GetSelectedInfoPointers(const Handle(AIS_InteractiveContext)& theContext) -{ - QList aSelectedInfo = VInspector_Tools::GetSelectedInfo(theContext); - return aSelectedInfo.size() > 2 ? aSelectedInfo[1].toString() : QString(); -} - -namespace -{ -static Standard_CString VInspector_Table_PrintDisplayActionType[5] = {"None", - "Display", - "Redisplay", - "Erase", - "Remove"}; -} - -//======================================================================= -// function : DisplayActionTypeToString -// purpose : -//======================================================================= -Standard_CString VInspector_Tools::DisplayActionTypeToString(View_DisplayActionType theType) -{ - return VInspector_Table_PrintDisplayActionType[theType]; -} - -//======================================================================= -// function : DisplayActionTypeFromString -// purpose : -//======================================================================= -Standard_Boolean VInspector_Tools::DisplayActionTypeFromString(Standard_CString theTypeString, - View_DisplayActionType& theType) -{ - const TCollection_AsciiString aName(theTypeString); - for (Standard_Integer aTypeIter = 0; aTypeIter <= View_DisplayActionType_RemoveId; ++aTypeIter) - { - Standard_CString aTypeName = VInspector_Table_PrintDisplayActionType[aTypeIter]; - if (aName == aTypeName) - { - theType = View_DisplayActionType(aTypeIter); - return Standard_True; - } - } - return Standard_False; -} diff --git a/tools/VInspector/VInspector_Tools.hxx b/tools/VInspector/VInspector_Tools.hxx deleted file mode 100644 index df176a4da2..0000000000 --- a/tools/VInspector/VInspector_Tools.hxx +++ /dev/null @@ -1,150 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_Tools_H -#define VInspector_Tools_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include - -class ViewControl_TableModelValues; - -class Graphic3d_IndexBuffer; -class Graphic3d_Buffer; -class Graphic3d_BoundBuffer; - -//! \class VInspector_Tools -//! The class that gives auxiliary methods for Visualization elements manipulation -class VInspector_Tools -{ - -public: - //! Returns string value of enumeration value - //! \param theType a shape type - //! \return text value - Standard_EXPORT static TCollection_AsciiString GetShapeTypeInfo(const TopAbs_ShapeEnum& theType); - - //! Returns number of selected owners for presentation - //! \param theContext an interactive context - //! \param theObject a presentation - //! \param theShapeInfoOnly if true, only BRep owners are taken - Standard_EXPORT static int SelectedOwners(const Handle(AIS_InteractiveContext)& theContext, - const Handle(AIS_InteractiveObject)& theObject, - const bool theShapeInfoOnly); - - //! Returns true if the owner is selected in the context - //! \param theContext an interactive context - //! \param theOwner a selectable owner - //! \return boolean value - Standard_EXPORT static bool IsOwnerSelected(const Handle(AIS_InteractiveContext)& theContext, - const Handle(SelectMgr_EntityOwner)& theOwner); - - //! Returns all owners present in the context - //! \param theContext an interactive context - //! \return container of owners - Standard_EXPORT static NCollection_List ContextOwners( - const Handle(AIS_InteractiveContext)& theContext); - - //! Returns active owners in main selector of context - //! \param theContext an interactive context - //! \param theEmptySelectableOwners container of owners with NULL presentation or not displayed - //! presentation \return container of owners - Standard_EXPORT static NCollection_List ActiveOwners( - const Handle(AIS_InteractiveContext)& theContext, - NCollection_List& theEmptySelectableOwners); - - //! Unhighlight selected, set selected the owners - //! \param theContext an interactive context - //! \param theOwners a container of owners - Standard_EXPORT static void AddOrRemoveSelectedShapes( - const Handle(AIS_InteractiveContext)& theContext, - const NCollection_List& theOwners); - - //! Unhighlight selected, set selected presentations - //! \param theContext an interactive context - //! \param thePresentations a container of presentations - Standard_EXPORT static void AddOrRemovePresentations( - const Handle(AIS_InteractiveContext)& theContext, - const NCollection_List& thePresentations); - - //! Returns information about presentation: Dynamic Type, Pointer info, Shape type info - //! \param theObject a presentation - //! \return container of values - Standard_EXPORT static QList GetInfo(Handle(AIS_InteractiveObject)& theObject); - - //! Returns information about current highlight: Names, Owners, Pointers, Owners - //! \param theContext an interactive context - //! \return container of values - Standard_EXPORT static QList GetHighlightInfo( - const Handle(AIS_InteractiveContext)& theContext); - - //! Returns information about current selection: Names, Owners, Pointers, Owners - //! \param theContext an interactive context - //! \return container of values - Standard_EXPORT static QList GetSelectedInfo( - const Handle(AIS_InteractiveContext)& theContext); - - //! Returns the first pointer of selection in the context - Standard_EXPORT static QString GetSelectedInfoPointers( - const Handle(AIS_InteractiveContext)& theContext); - - //! Returns the string name for a given type. - //! @param theType action type - //! @return string identifier from the display action type - Standard_EXPORT static Standard_CString DisplayActionTypeToString(View_DisplayActionType theType); - - //! Returns the enumeration type from the given string identifier (using case-insensitive - //! comparison). - //! @param theTypeString string identifier - //! @return string identifier from the display action type - static View_DisplayActionType DisplayActionTypeFromString(Standard_CString theTypeString) - { - View_DisplayActionType aType = View_DisplayActionType_NoneId; - DisplayActionTypeFromString(theTypeString, aType); - return aType; - } - - //! Determines the enumeration type from the given string identifier (using case-insensitive - //! comparison). - //! @param theTypeString string identifier - //! @param theType detected action type - //! @return TRUE if string identifier is known - Standard_EXPORT static Standard_Boolean DisplayActionTypeFromString( - Standard_CString theTypeString, - View_DisplayActionType& theType); -}; - -#endif diff --git a/tools/VInspector/VInspector_ViewModel.cxx b/tools/VInspector/VInspector_ViewModel.cxx deleted file mode 100644 index 6cdc6218fe..0000000000 --- a/tools/VInspector/VInspector_ViewModel.cxx +++ /dev/null @@ -1,147 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#include -#include -#include -#include - -const int COLUMN_POINTER_WIDTH = 70; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -VInspector_ViewModel::VInspector_ViewModel(QObject* theParent) - : TreeModel_ModelBase(theParent) -{ -} - -// ======================================================================= -// function : InitColumns -// purpose : -// ======================================================================= -void VInspector_ViewModel::InitColumns() -{ - TreeModel_ModelBase::InitColumns(); - - setHeaderItem(3, TreeModel_HeaderSection("Pointer", COLUMN_POINTER_WIDTH)); - setHeaderItem(4, TreeModel_HeaderSection("SelectedOwners", -1)); -} - -// ======================================================================= -// function : createRootItem -// purpose : -// ======================================================================= -TreeModel_ItemBasePtr VInspector_ViewModel::createRootItem(const int theColumnId) -{ - return VInspector_ItemContext::CreateItem(TreeModel_ItemBasePtr(), 0, theColumnId); -} - -// ======================================================================= -// function : GetContext -// purpose : -// ======================================================================= -Handle(AIS_InteractiveContext) VInspector_ViewModel::GetContext() const -{ - return itemDynamicCast(RootItem(0))->GetContext(); -} - -// ======================================================================= -// function : SetContext -// purpose : -// ======================================================================= -void VInspector_ViewModel::SetContext(const Handle(AIS_InteractiveContext)& theContext) -{ - // fill root item by the application - for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++) - itemDynamicCast(myRootItems[aColId])->SetContext(theContext); - - UpdateTreeModel(); -} - -// ======================================================================= -// function : FindPointers -// purpose : -// ======================================================================= -void VInspector_ViewModel::FindPointers(const QStringList& thePointers, - const QModelIndex& theParent, - QModelIndexList& theFoundIndices) -{ - (void)thePointers; - (void)theParent; - (void)theFoundIndices; - // should be used after Object of items is improved, as it takes a lot of time on BVH item - /* - if (thePointers.isEmpty()) - return; - - QModelIndex aParentIndex = theParent.isValid() ? theParent : index (0, 0); - TreeModel_ItemBasePtr aParentItem = TreeModel_ModelBase::GetItemByIndex (aParentIndex); // context - item for (int aRowId = 0, aCount = aParentItem->rowCount(); aRowId < aCount; aRowId++) - { - QModelIndex anIndex = index (aRowId, 0, aParentIndex); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex); - VInspector_ItemBasePtr aVItem = itemDynamicCast(anItemBase); - if (!aVItem) - continue; - const Handle(Standard_Transient)& anObject = aVItem->Object(); - TCollection_AsciiString aPointerInfo = Standard_Dump::GetPointerInfo (anObject); - if (thePointers.contains (aPointerInfo.ToCString())) - theFoundIndices.append (anIndex); - - FindPointers (thePointers, anIndex, theFoundIndices); - }*/ -} - -// ======================================================================= -// function : FindIndex -// purpose : -// ======================================================================= -QModelIndex VInspector_ViewModel::FindIndex( - const Handle(AIS_InteractiveObject)& thePresentation) const -{ - QModelIndex aParentIndex = index(0, 0); - TreeModel_ItemBasePtr aParentItem = - TreeModel_ModelBase::GetItemByIndex(aParentIndex); // context item - for (int aRowId = 0, aCount = aParentItem->rowCount(); aRowId < aCount; aRowId++) - { - QModelIndex anIndex = index(aRowId, 0, aParentIndex); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - VInspector_ItemPresentableObjectPtr anItemPrs = - itemDynamicCast(anItemBase); - if (!anItemPrs) - continue; - if (anItemPrs->GetInteractiveObject() == thePresentation) - return anIndex; - } - return QModelIndex(); -} - -// ======================================================================= -// function : UpdateTreeModel -// purpose : -// ======================================================================= -void VInspector_ViewModel::UpdateTreeModel() -{ - Reset(); - EmitLayoutChanged(); -} diff --git a/tools/VInspector/VInspector_ViewModel.hxx b/tools/VInspector/VInspector_ViewModel.hxx deleted file mode 100644 index ef3e102aa6..0000000000 --- a/tools/VInspector/VInspector_ViewModel.hxx +++ /dev/null @@ -1,85 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_ViewModel_H -#define VInspector_ViewModel_H - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -class OCAFSampleAPI_Module; -class OCAFSampleModel_DocumentMgr; - -class QItemSelectionModel; - -//! \class VInspector_ViewModel -//! The class that visualizes the AIS context content -class VInspector_ViewModel : public TreeModel_ModelBase -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT VInspector_ViewModel(QObject* theParent); - - //! Destructor - virtual ~VInspector_ViewModel() {} - - //! Creates model columns and root items. - Standard_EXPORT virtual void InitColumns() Standard_OVERRIDE; - - //! Initialize the model by the given context - //! \param theContext viewer context - Standard_EXPORT Handle(AIS_InteractiveContext) GetContext() const; - - //! Initialize the model by the given context - //! \param theContext viewer context - Standard_EXPORT void SetContext(const Handle(AIS_InteractiveContext)& theContext); - - //! Returns tree view indices for the given pointers of presentable object - //! \param thePointers a list of presentation pointers - //! \param theParent an index of the parent item - //! \param[out] container of indices - Standard_EXPORT void FindPointers(const QStringList& thePointers, - const QModelIndex& theParent, - QModelIndexList& theFoundIndices); - - //! Returns tree model index of the presentation item in the tree view. - //! \param thePresentation a presentation - //! \return model index if the value is found or Null model index - Standard_EXPORT QModelIndex FindIndex(const Handle(AIS_InteractiveObject)& thePresentation) const; - - //! Updates tree model - Standard_EXPORT void UpdateTreeModel(); - -protected: - //! Creates root item - //! \param theColumnId index of a column - Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) - Standard_OVERRIDE; -}; - -#endif diff --git a/tools/VInspector/VInspector_Window.cxx b/tools/VInspector/VInspector_Window.cxx deleted file mode 100644 index 2bab8c4e77..0000000000 --- a/tools/VInspector/VInspector_Window.cxx +++ /dev/null @@ -1,1039 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const int VINSPECTOR_DEFAULT_PROPERTY_VIEW_WIDTH = 300; -const int VINSPECTOR_DEFAULT_PROPERTY_VIEW_HEIGHT = 1000; - -const int VINSPECTOR_DEFAULT_WIDTH = 1250; -const int VINSPECTOR_DEFAULT_HEIGHT = 800; - -const int VINSPECTOR_DEFAULT_POSITION_X = 200; -const int VINSPECTOR_DEFAULT_POSITION_Y = 60; - -const int VINSPECTOR_DEFAULT_VIEW_WIDTH = 400; -const int VINSPECTOR_DEFAULT_VIEW_HEIGHT = 1000; - -const int VINSPECTOR_DEFAULT_VIEW_POSITION_X = - 200 + 900 + 100; // TINSPECTOR_DEFAULT_POSITION_X + TINSPECTOR_DEFAULT_WIDTH + 100 -const int VINSPECTOR_DEFAULT_VIEW_POSITION_Y = 60; // TINSPECTOR_DEFAULT_POSITION_Y + 50 - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -VInspector_Window::VInspector_Window() - : myParent(0), - myExportToShapeViewDialog(0), - myViewWindow(0) -{ - myDisplayer = new View_Displayer(); - - myMainWindow = new QMainWindow(0); - - QWidget* aCentralWidget = new QWidget(myMainWindow); - QGridLayout* aParentLay = new QGridLayout(aCentralWidget); - aParentLay->setContentsMargins(0, 0, 0, 0); - aParentLay->setSpacing(0); - - // restore state of tool bar: on the bottom of the window - myToolBar = new VInspector_ToolBar(aCentralWidget); - connect(myToolBar, SIGNAL(actionClicked(int)), this, SLOT(onToolBarActionClicked(int))); - aParentLay->addWidget(myToolBar->GetControl(), 0, 0); - - // tree view - myTreeView = new QTreeView(aCentralWidget); - myTreeView->setSelectionBehavior(QAbstractItemView::SelectRows); - myTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection); - myTreeView->header()->setStretchLastSection(true); - myTreeView->setContextMenuPolicy(Qt::CustomContextMenu); - VInspector_ViewModel* aTreeModel = new VInspector_ViewModel(myTreeView); - aTreeModel->InitColumns(); - myTreeView->setModel(aTreeModel); - // hide Visibility column - TreeModel_HeaderSection* anItem = - aTreeModel->ChangeHeaderItem((int)TreeModel_ColumnType_Visibility); - anItem->SetIsHidden(true); - - connect(myTreeView, - SIGNAL(customContextMenuRequested(const QPoint&)), - this, - SLOT(onTreeViewContextMenuRequested(const QPoint&))); - new TreeModel_ContextMenu(myTreeView); - - QItemSelectionModel* aSelModel = new QItemSelectionModel(myTreeView->model(), myTreeView); - myTreeView->setSelectionModel(aSelModel); - connect(aSelModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&))); - - aParentLay->addWidget(myTreeView, 1, 0); - aParentLay->setRowStretch(1, 1); - myMainWindow->setCentralWidget(aCentralWidget); - - // property view - myPropertyView = new ViewControl_PropertyView( - myMainWindow, - QSize(VINSPECTOR_DEFAULT_PROPERTY_VIEW_WIDTH, VINSPECTOR_DEFAULT_PROPERTY_VIEW_HEIGHT)); - myPropertyPanelWidget = new QDockWidget(tr("PropertyPanel"), myMainWindow); - myPropertyPanelWidget->setObjectName(myPropertyPanelWidget->windowTitle()); - myPropertyPanelWidget->setTitleBarWidget(new QWidget(myMainWindow)); - myPropertyPanelWidget->setWidget(myPropertyView->GetControl()); - myMainWindow->addDockWidget(Qt::RightDockWidgetArea, myPropertyPanelWidget); - connect(myPropertyPanelWidget->toggleViewAction(), - SIGNAL(toggled(bool)), - this, - SLOT(onPropertyPanelShown(bool))); - - myMainWindow->resize(450, 800); - myMainWindow->move(60, 20); - - myMainWindow->resize(VINSPECTOR_DEFAULT_WIDTH, VINSPECTOR_DEFAULT_HEIGHT); - myMainWindow->move(VINSPECTOR_DEFAULT_POSITION_X, VINSPECTOR_DEFAULT_POSITION_Y); -} - -// ======================================================================= -// function : SetParent -// purpose : -// ======================================================================= -void VInspector_Window::SetParent(void* theParent) -{ - myParent = (QWidget*)theParent; - if (!myParent) - return; - - QLayout* aLayout = myParent->layout(); - if (aLayout) - aLayout->addWidget(GetMainWindow()); -} - -// ======================================================================= -// function : FillActionsMenu -// purpose : -// ======================================================================= -void VInspector_Window::FillActionsMenu(void* theMenu) -{ - QMenu* aMenu = (QMenu*)theMenu; - QList aDockwidgets = myMainWindow->findChildren(); - for (QList::iterator it = aDockwidgets.begin(); it != aDockwidgets.end(); ++it) - { - QDockWidget* aDockWidget = *it; - if (aDockWidget->parentWidget() == myMainWindow) - aMenu->addAction(aDockWidget->toggleViewAction()); - } -} - -// ======================================================================= -// function : GetPreferences -// purpose : -// ======================================================================= -void VInspector_Window::GetPreferences(TInspectorAPI_PreferencesDataMap& theItem) -{ - theItem.Bind("geometry", - TreeModel_Tools::ToString(myMainWindow->saveState()).toStdString().c_str()); - - QMap anItems; - TreeModel_Tools::SaveState(myTreeView, anItems); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - { - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - } - - anItems.clear(); - View_PreviewParameters::SaveState(displayer()->DisplayPreview()->GetPreviewParameters(), - anItems, - "preview_parameters_"); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - - anItems.clear(); - TreeModel_Tools::SaveState(myTreeView, anItems); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - { - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - } - - anItems.clear(); - ViewControl_PropertyView::SaveState(myPropertyView, anItems, "property_view_parameters_"); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - - if (myViewWindow) - { - anItems.clear(); - View_Window::SaveState(myViewWindow, anItems); - for (QMap::const_iterator anItemsIt = anItems.begin(); - anItemsIt != anItems.end(); - anItemsIt++) - theItem.Bind(anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); - } -} - -// ======================================================================= -// function : SetPreferences -// purpose : -// ======================================================================= -void VInspector_Window::SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem) -{ - if (theItem.IsEmpty()) - { - TreeModel_Tools::SetDefaultHeaderSections(myTreeView); - return; - } - - for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt(theItem); anItemIt.More(); - anItemIt.Next()) - { - TCollection_AsciiString anItemKey = anItemIt.Key(); - TCollection_AsciiString anItemValue = anItemIt.Value(); - if (anItemKey.IsEqual("geometry")) - myMainWindow->restoreState(TreeModel_Tools::ToByteArray(anItemValue.ToCString())); - else if (TreeModel_Tools::RestoreState(myTreeView, - anItemKey.ToCString(), - anItemValue.ToCString())) - continue; - else if (View_PreviewParameters::RestoreState( - displayer()->DisplayPreview()->GetPreviewParameters(), - anItemKey.ToCString(), - anItemValue.ToCString(), - "preview_parameters_")) - continue; - else if (ViewControl_PropertyView::RestoreState(myPropertyView, - anItemKey.ToCString(), - anItemValue.ToCString(), - "property_view_parameters_")) - continue; - else if (myViewWindow - && View_Window::RestoreState(myViewWindow, - anItemIt.Key().ToCString(), - anItemIt.Value().ToCString())) - continue; - } -} - -// ======================================================================= -// function : UpdateContent -// purpose : -// ======================================================================= -void VInspector_Window::UpdateContent() -{ - TCollection_AsciiString aName = "TKVInspector"; - - bool isModelUpdated = false; - if (myParameters->FindParameters(aName)) - isModelUpdated = Init(myParameters->Parameters(aName)); - if (myParameters->FindFileNames(aName)) - { - for (NCollection_List::Iterator aFileNamesIt( - myParameters->FileNames(aName)); - aFileNamesIt.More(); - aFileNamesIt.Next()) - isModelUpdated = OpenFile(aFileNamesIt.Value()) || isModelUpdated; - - NCollection_List aNames; - myParameters->SetFileNames(aName, aNames); - } - if (!isModelUpdated) - UpdateTreeModel(); - - // make AIS_InteractiveObject selected selected if exist in select parameters - NCollection_List anObjects; - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (aViewModel && myParameters->GetSelectedObjects(aName, anObjects)) - { - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - aSelectionModel->clear(); - for (NCollection_List::Iterator aParamsIt(anObjects); - aParamsIt.More(); - aParamsIt.Next()) - { - Handle(Standard_Transient) anObject = aParamsIt.Value(); - Handle(AIS_InteractiveObject) aPresentation = - Handle(AIS_InteractiveObject)::DownCast(anObject); - if (aPresentation.IsNull()) - continue; - - QModelIndex aPresentationIndex = aViewModel->FindIndex(aPresentation); - if (!aPresentationIndex.isValid()) - continue; - aSelectionModel->select(aPresentationIndex, QItemSelectionModel::Select); - myTreeView->scrollTo(aPresentationIndex); - } - } -} - -// ======================================================================= -// function : SelectedPresentations -// purpose : -// ======================================================================= -NCollection_List VInspector_Window::SelectedPresentations( - QItemSelectionModel* theModel) -{ - NCollection_List aSelectedPresentations; - - QList anItems = - TreeModel_ModelBase::SelectedItems(theModel->selectedIndexes()); - - QList aSelectedIds; // Remember of selected address in order to avoid duplicates - NCollection_List anItemPresentations; - for (QList::const_iterator anItemIt = anItems.begin(); - anItemIt != anItems.end(); - ++anItemIt) - { - TreeModel_ItemBasePtr anItem = *anItemIt; - VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); - if (!aVItem) - continue; - - anItemPresentations.Clear(); - aVItem->Presentations(anItemPresentations); - - for (NCollection_List::Iterator anIt(anItemPresentations); - anIt.More(); - anIt.Next()) - { - Handle(AIS_InteractiveObject) aPresentation = - Handle(AIS_InteractiveObject)::DownCast(anIt.Value()); - if (aSelectedIds.contains((size_t)aPresentation.get())) - continue; - aSelectedIds.append((size_t)aPresentation.get()); - if (!aPresentation.IsNull()) - aSelectedPresentations.Append(aPresentation); - } - } - return aSelectedPresentations; -} - -// ======================================================================= -// function : SelectedShapes -// purpose : -// ======================================================================= -void VInspector_Window::SelectedShapes( - NCollection_List& theSelPresentations) -{ - QModelIndexList theIndices = myTreeView->selectionModel()->selectedIndexes(); - - QList anItems = TreeModel_ModelBase::SelectedItems(theIndices); - for (QList::const_iterator anItemIt = anItems.begin(); - anItemIt != anItems.end(); - ++anItemIt) - { - TreeModel_ItemBasePtr anItem = *anItemIt; - VInspector_ItemBasePtr aVItem = itemDynamicCast(anItem); - if (!aVItem /*|| aVItem->Row() == 0*/) - { - anItem->Presentations(theSelPresentations); - continue; - } - - TopoDS_Shape aShape = aVItem->GetPresentationShape(); - if (aShape.IsNull()) - continue; - - theSelPresentations.Append(new Convert_TransientShape(aShape)); - } -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -bool VInspector_Window::Init(const NCollection_List& theParameters) -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aViewModel) - return Standard_False; - - Handle(AIS_InteractiveContext) aContext; - Standard_Boolean isModelUpdated = Standard_False; - - for (NCollection_List::Iterator aParamsIt(theParameters); - aParamsIt.More(); - aParamsIt.Next()) - { - Handle(Standard_Transient) anObject = aParamsIt.Value(); - if (aContext.IsNull()) - aContext = Handle(AIS_InteractiveContext)::DownCast(anObject); - } - if (aViewModel->GetContext() != aContext) - SetContext(aContext); - else - isModelUpdated = Standard_True; - - if (isModelUpdated) - UpdateTreeModel(); - - return true; -} - -// ======================================================================= -// function : SetContext -// purpose : -// ======================================================================= -void VInspector_Window::SetContext(const Handle(AIS_InteractiveContext)& theContext) -{ - if (theContext.IsNull()) - return; - - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - aViewModel->SetContext(theContext); - myTreeView->setExpanded(aViewModel->index(0, 0), true); - - if (myDisplayer) - myDisplayer->SetContext(theContext); -} - -// ======================================================================= -// function : OpenFile -// purpose : -// ======================================================================= -bool VInspector_Window::OpenFile(const TCollection_AsciiString& theFileName) -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aViewModel) - return false; - - Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); - bool isModelUpdated = false; - if (aContext.IsNull()) - { - aContext = createView(); - SetContext(aContext); - - const Handle(V3d_Viewer) aViewer = aViewModel->GetContext()->CurrentViewer(); - if (!aViewer.IsNull()) - { - addLight(Graphic3d_TOLS_POSITIONAL, aViewer); - addLight(Graphic3d_TOLS_SPOT, aViewer); - } - - isModelUpdated = true; - } - - TopoDS_Shape aShape = Convert_Tools::ReadShape(theFileName); - if (aShape.IsNull()) - return isModelUpdated; - - Handle(AIS_Shape) aPresentation = new AIS_Shape(aShape); - aPresentation->Attributes()->SetAutoTriangulation(Standard_False); - - View_Displayer* aDisplayer = displayer(); - aDisplayer->DisplayPresentation(aPresentation); - aContext->UpdateCurrentViewer(); - - UpdateTreeModel(); - myTreeView->setExpanded(aViewModel->index(0, 0), true); - return true; -} - -// ======================================================================= -// function : onTreeViewContextMenuRequested -// purpose : -// ======================================================================= -void VInspector_Window::onTreeViewContextMenuRequested(const QPoint& thePosition) -{ - QMenu* aMenu = new QMenu(GetMainWindow()); - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Export to ShapeView"), - SLOT(onExportToShapeView()), - GetMainWindow(), - this)); - aMenu->addSeparator(); - - QModelIndex anIndex = - TreeModel_ModelBase::SingleSelected(myTreeView->selectionModel()->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (anItemBase) - { - if (itemDynamicCast(anItemBase)) - { - aMenu->addSeparator(); - QMenu* anExplodeMenu = aMenu->addMenu("Add Light"); - - anExplodeMenu->addAction( - ViewControl_Tools::CreateAction("Ambient", SLOT(onAddLight()), myMainWindow, this)); - anExplodeMenu->addAction( - ViewControl_Tools::CreateAction("Directional", SLOT(onAddLight()), myMainWindow, this)); - anExplodeMenu->addAction( - ViewControl_Tools::CreateAction("Positional", SLOT(onAddLight()), myMainWindow, this)); - anExplodeMenu->addAction( - ViewControl_Tools::CreateAction("Spot", SLOT(onAddLight()), myMainWindow, this)); - } - - if (itemDynamicCast(anItemBase)) - { - aMenu->addSeparator(); - aMenu->addAction( - ViewControl_Tools::CreateAction("Remove Light", SLOT(onRemoveLight()), myMainWindow, this)); - VInspector_ItemGraphic3dCLightPtr anItemLight = - itemDynamicCast(anItemBase); - if (!anItemLight->GetLight().IsNull()) - { - bool isOn = anItemLight->GetLight()->IsEnabled(); - aMenu->addAction(ViewControl_Tools::CreateAction(isOn ? "OFF Light" : "ON Light", - SLOT(onOnOffLight()), - myMainWindow, - this)); - } - } - } - - aMenu->addSeparator(); - for (int aTypeId = (int)View_DisplayActionType_DisplayId; - aTypeId <= (int)View_DisplayActionType_RemoveId; - aTypeId++) - { - aMenu->addAction(ViewControl_Tools::CreateAction( - VInspector_Tools::DisplayActionTypeToString((View_DisplayActionType)aTypeId), - SLOT(onDisplayActionTypeClicked()), - GetMainWindow(), - this)); - } - aMenu->addSeparator(); - - aMenu->addAction( - ViewControl_Tools::CreateAction(tr("Expand"), SLOT(onExpand()), GetMainWindow(), this)); - aMenu->addAction( - ViewControl_Tools::CreateAction(tr("Expand All"), SLOT(onExpandAll()), GetMainWindow(), this)); - aMenu->addAction(ViewControl_Tools::CreateAction(tr("Collapse All"), - SLOT(onCollapseAll()), - GetMainWindow(), - this)); - - QPoint aPoint = myTreeView->mapToGlobal(thePosition); - aMenu->exec(aPoint); -} - -// ======================================================================= -// function : onToolBarActionClicked -// purpose : -// ======================================================================= -void VInspector_Window::onToolBarActionClicked(const int theActionId) -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aViewModel) - return; - - switch (theActionId) - { - case VInspector_ToolActionType_UpdateId: { - UpdateTreeModel(); - break; - } - default: - break; - } -} - -// ======================================================================= -// function : onPropertyPanelShown -// purpose : -// ======================================================================= -void VInspector_Window::onPropertyPanelShown(bool isToggled) -{ - if (!isToggled) - return; - - myPropertyView->Init(ViewControl_Tools::CreateTableModelValues(myTreeView->selectionModel())); -} - -// ======================================================================= -// function : onTreeViewSelectionChanged -// purpose : -// ======================================================================= -void VInspector_Window::onTreeViewSelectionChanged(const QItemSelection&, const QItemSelection&) -{ - if (myPropertyPanelWidget->toggleViewAction()->isChecked()) - myPropertyView->Init(ViewControl_Tools::CreateTableModelValues(myTreeView->selectionModel())); - - NCollection_List aSelPresentations; - - QModelIndexList aSelectedIndices = myTreeView->selectionModel()->selectedIndexes(); - for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - QModelIndex anIndex = *aSelIt; - if (anIndex.column() != 0) - continue; - - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - continue; - - anItemBase->Presentations(aSelPresentations); - } - - SelectedShapes(aSelPresentations); - displayer()->UpdatePreview(View_DisplayActionType_DisplayId, aSelPresentations); -} - -// ======================================================================= -// function : onExportToShapeView -// purpose : -// ======================================================================= -void VInspector_Window::onExportToShapeView() -{ - NCollection_List aSelectedShapes; - SelectedShapes(aSelectedShapes); - - TCollection_AsciiString aPluginName("TKShapeView"); - NCollection_List aParameters; - NCollection_List anItemNames; - - QStringList anExportedPointers; - if (aSelectedShapes.Extent() > 0) - { - for (NCollection_List::Iterator aShapeIt(aSelectedShapes); - aShapeIt.More(); - aShapeIt.Next()) - { - Handle(Convert_TransientShape) aShapePtr = - Handle(Convert_TransientShape)::DownCast(aShapeIt.Value()); - if (aShapePtr.IsNull()) - continue; - - const TopoDS_Shape& aShape = aShapePtr->Shape(); - if (aShape.IsNull()) - continue; - aParameters.Append(aShape.TShape()); - anItemNames.Append(TInspectorAPI_PluginParameters::ParametersToString(aShape)); - anExportedPointers.append(Standard_Dump::GetPointerInfo(aShape.TShape(), true).ToCString()); - } - } - - if (anExportedPointers.isEmpty()) - return; - - TCollection_AsciiString aPluginShortName = aPluginName.SubString(3, aPluginName.Length()); - QString aMessage = QString("Objects %1 are sent to %2.") - .arg(anExportedPointers.join(", ")) - .arg(aPluginShortName.ToCString()); - QString aQuestion = QString("Would you like to activate %1 immediately?\n") - .arg(aPluginShortName.ToCString()) - .toStdString() - .c_str(); - if (!myExportToShapeViewDialog) - myExportToShapeViewDialog = new ViewControl_MessageDialog(myParent, aMessage, aQuestion); - else - myExportToShapeViewDialog->SetInformation(aMessage); - myExportToShapeViewDialog->Start(); - - myParameters->SetSelectedNames(aPluginName, anItemNames); - myParameters->SetParameters(aPluginName, aParameters, myExportToShapeViewDialog->IsAccepted()); -} - -// ======================================================================= -// function : onAddLight -// purpose : -// ======================================================================= -void VInspector_Window::onAddLight() -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aViewModel) - return; - const Handle(V3d_Viewer) aViewer = aViewModel->GetContext()->CurrentViewer(); - if (aViewer.IsNull()) - return; - - QAction* anAction = (QAction*)sender(); - QString aText = anAction->text(); - - Graphic3d_TypeOfLightSource aLightSourceType = Graphic3d_TOLS_AMBIENT; - - if (aText == "Ambient") - { - aLightSourceType = Graphic3d_TOLS_AMBIENT; - } - else if (aText == "Directional") - { - aLightSourceType = Graphic3d_TOLS_DIRECTIONAL; - } - else if (aText == "Positional") - { - aLightSourceType = Graphic3d_TOLS_POSITIONAL; - } - else if (aText == "Spot") - { - aLightSourceType = Graphic3d_TOLS_SPOT; - } - else - { - return; - } - - addLight(aLightSourceType, aViewer); -} - -// ======================================================================= -// function : onRemoveLight -// purpose : -// ======================================================================= -void VInspector_Window::onRemoveLight() -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - const Handle(V3d_Viewer) aViewer = aViewModel ? aViewModel->GetContext()->CurrentViewer() : NULL; - if (aViewer.IsNull()) - { - return; - } - - QModelIndex anIndex = - TreeModel_ModelBase::SingleSelected(myTreeView->selectionModel()->selectedIndexes(), 0); - VInspector_ItemGraphic3dCLightPtr aLightItem = - itemDynamicCast(TreeModel_ModelBase::GetItemByIndex(anIndex)); - if (!aLightItem) - { - return; - } - - if (aViewer->ActiveLights().Extent() == 1) // not possible to remove the latest light - { - return; - } - - Handle(Graphic3d_CLight) aLight = aLightItem->GetLight(); - aViewer->DelLight(aLight); - aViewer->UpdateLights(); - - aViewer->Invalidate(); - aViewer->Redraw(); - UpdateTreeModel(); -} - -// ======================================================================= -// function : onOnOffLight -// purpose : -// ======================================================================= -void VInspector_Window::onOnOffLight() -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - const Handle(V3d_Viewer) aViewer = aViewModel ? aViewModel->GetContext()->CurrentViewer() : NULL; - if (aViewer.IsNull()) - { - return; - } - - QModelIndex anIndex = - TreeModel_ModelBase::SingleSelected(myTreeView->selectionModel()->selectedIndexes(), 0); - - VInspector_ItemGraphic3dCLightPtr anItemLight = - itemDynamicCast(TreeModel_ModelBase::GetItemByIndex(anIndex)); - if (anItemLight->GetLight().IsNull()) - return; - - bool isOn = anItemLight->GetLight()->IsEnabled(); - anItemLight->GetLight()->SetEnabled(!isOn); - - aViewer->UpdateLights(); - aViewer->Invalidate(); - aViewer->Redraw(); - UpdateTreeModel(); -} - -// ======================================================================= -// function : onDisplayActionTypeClicked -// purpose : -// ======================================================================= -void VInspector_Window::onDisplayActionTypeClicked() -{ - QAction* anAction = (QAction*)sender(); - - displaySelectedPresentations( - VInspector_Tools::DisplayActionTypeFromString(anAction->text().toStdString().c_str())); -} - -// ======================================================================= -// function : onExpand -// purpose : -// ======================================================================= -void VInspector_Window::onExpand() -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - int aLevels = 2; - TreeModel_Tools::SetExpanded(myTreeView, aSelectedIndices[aSelectedId], true, aLevels); - } - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onExpandAll -// purpose : -// ======================================================================= -void VInspector_Window::onExpandAll() -{ - QApplication::setOverrideCursor(Qt::WaitCursor); - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - int aLevels = -1; - TreeModel_Tools::SetExpanded(myTreeView, aSelectedIndices[aSelectedId], true, aLevels); - } - QApplication::restoreOverrideCursor(); -} - -// ======================================================================= -// function : onCollapseAll -// purpose : -// ======================================================================= -void VInspector_Window::onCollapseAll() -{ - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes(); - for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) - { - int aLevels = -1; - TreeModel_Tools::SetExpanded(myTreeView, aSelectedIndices[aSelectedId], false, aLevels); - } -} - -// ======================================================================= -// function : UpdateTreeModel -// purpose : -// ======================================================================= -void VInspector_Window::UpdateTreeModel() -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (aViewModel) - aViewModel->UpdateTreeModel(); -} - -// ======================================================================= -// function : displaySelectedPresentations -// purpose : -// ======================================================================= - -void VInspector_Window::displaySelectedPresentations(const View_DisplayActionType theType) -{ - VInspector_ViewModel* aViewModel = dynamic_cast(myTreeView->model()); - if (!aViewModel) - return; - - Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext(); - if (aContext.IsNull()) - return; - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - if (!aSelectionModel) - return; - - NCollection_List aSelectedPresentations = - SelectedPresentations(aSelectionModel); - // the order of objects returned by AIS_InteractiveContext is changed because the processed object - // is moved from Erased to Displayed container or back - aSelectionModel->clear(); - - if (aSelectedPresentations.Extent() == 0) - return; - - for (NCollection_List::Iterator anIOIt(aSelectedPresentations); - anIOIt.More(); - anIOIt.Next()) - { - Handle(AIS_InteractiveObject) aPresentation = anIOIt.Value(); - switch (theType) - { - case View_DisplayActionType_DisplayId: { - aContext->Display(aPresentation, false); - aContext->Load(aPresentation, -1); - } - break; - - case View_DisplayActionType_RedisplayId: - aContext->Redisplay(aPresentation, false); - break; - case View_DisplayActionType_EraseId: - aContext->Erase(aPresentation, false); - break; - case View_DisplayActionType_RemoveId: - aContext->Remove(aPresentation, false); - break; - default: - break; - } - } - aContext->UpdateCurrentViewer(); - - UpdateTreeModel(); -} - -// ======================================================================= -// function : highlightTreeViewItems -// purpose : -// ======================================================================= -void VInspector_Window::highlightTreeViewItems(const QStringList& thePointers) -{ - VInspector_ViewModel* aTreeModel = dynamic_cast(myTreeView->model()); - if (!aTreeModel) - return; - - QModelIndexList anIndices; - aTreeModel->FindPointers(thePointers, QModelIndex(), anIndices); - for (int anIndicesId = 0, aSize = anIndices.size(); anIndicesId < aSize; anIndicesId++) - { - QModelIndex anIndex = anIndices[anIndicesId]; - TreeModel_Tools::SetExpandedTo(myTreeView, anIndex); - } - aTreeModel->SetHighlighted(anIndices); - - if (!anIndices.isEmpty()) - myTreeView->scrollTo(anIndices.last()); -} - -// ======================================================================= -// function : selectTreeViewItems -// purpose : -// ======================================================================= -void VInspector_Window::selectTreeViewItems(const QStringList& thePointers) -{ - VInspector_ViewModel* aTreeModel = dynamic_cast(myTreeView->model()); - if (!aTreeModel) - return; - - QModelIndexList anIndices; - aTreeModel->FindPointers(thePointers, QModelIndex(), anIndices); - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - aSelectionModel->clear(); - for (int anIndicesId = 0, aSize = anIndices.size(); anIndicesId < aSize; anIndicesId++) - { - QModelIndex anIndex = anIndices[anIndicesId]; - TreeModel_Tools::SetExpandedTo(myTreeView, anIndex); - aSelectionModel->select(anIndex, QItemSelectionModel::Select); - } -} - -// ======================================================================= -// function : createView -// purpose : -// ======================================================================= -Handle(AIS_InteractiveContext) VInspector_Window::createView() -{ - // create two view windows - Handle(AIS_InteractiveContext) aContext = View_Viewer::CreateStandardViewer(); - - myViewWindow = new View_Window(0, aContext, false /*for opening several BREP files*/, true); - myViewWindow->SetPredefinedSize(VINSPECTOR_DEFAULT_VIEW_WIDTH, VINSPECTOR_DEFAULT_VIEW_HEIGHT); - myViewWindow->move(VINSPECTOR_DEFAULT_VIEW_POSITION_X, VINSPECTOR_DEFAULT_VIEW_POSITION_Y); - myViewWindow->show(); - - return aContext; -} - -// ======================================================================= -// function : displayer -// purpose : -// ======================================================================= -View_Displayer* VInspector_Window::displayer() -{ - if (myViewWindow) - return myViewWindow->Displayer(); - - return myDisplayer; -} - -// ======================================================================= -// function : addLight -// purpose : -// ======================================================================= -void VInspector_Window::addLight(const Graphic3d_TypeOfLightSource& theSourceLight, - const Handle(V3d_Viewer)& theViewer) -{ - Standard_Boolean aNeedDirection = - theSourceLight == Graphic3d_TOLS_DIRECTIONAL || theSourceLight == Graphic3d_TOLS_SPOT; - - Handle(Graphic3d_CLight) aLight = new Graphic3d_CLight(theSourceLight); - if (aNeedDirection) - { - aLight->SetDirection(gp::DZ()); - } - if (theSourceLight == Graphic3d_TOLS_SPOT) - { - aLight->SetAngle((Standard_ShortReal)M_PI - ShortRealEpsilon()); - aLight->SetPosition(gp_Pnt(-100, -100, -100)); - } - - theViewer->AddLight(aLight); - theViewer->SetLightOn(aLight); - - theViewer->Invalidate(); - theViewer->Redraw(); - UpdateTreeModel(); -} diff --git a/tools/VInspector/VInspector_Window.hxx b/tools/VInspector/VInspector_Window.hxx deleted file mode 100644 index 28ec62e0fe..0000000000 --- a/tools/VInspector/VInspector_Window.hxx +++ /dev/null @@ -1,213 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef VInspector_Window_H -#define VInspector_Window_H - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -class ViewControl_MessageDialog; -class ViewControl_PropertyView; - -class VInspector_ToolBar; - -class View_Displayer; -class View_Window; - -class QAbstractItemModel; -class QAction; -class QDockWidget; -class QTreeView; -class QWidget; - -//! \class VInspector_Window -//! Window that unites all VInspector controls. -class VInspector_Window : public QObject -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT VInspector_Window(); - - //! Destructor - virtual ~VInspector_Window() {} - - //! Provides the container with a parent where this container should be inserted. - //! If Qt implementation, it should be QWidget with QLayout set inside - //! \param theParent a parent class - Standard_EXPORT void SetParent(void* theParent); - - //! Sets parameters container, it should be used when the plugin is initialized or in update - //! content \param theParameters a parameters container - void SetParameters(const Handle(TInspectorAPI_PluginParameters)& theParameters) - { - myParameters = theParameters; - } - - //! Provide container for actions available in inspector on general level - //! \param theMenu if Qt implementation, it is QMenu object - Standard_EXPORT void FillActionsMenu(void* theMenu); - - //! Returns plugin preferences: dock widgets state, tree view columns. - //! \param theItem container of preference elements - Standard_EXPORT void GetPreferences(TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies plugin preferences - //! \param theItem container of preference elements - Standard_EXPORT void SetPreferences(const TInspectorAPI_PreferencesDataMap& theItem); - - //! Applies parameters to Init controls, opens files if there are in parameters, updates OCAF tree - //! view model - Standard_EXPORT void UpdateContent(); - - //! Returns main control - QWidget* GetMainWindow() const { return myMainWindow; } - - //! Returns presentations of selected items in tree model - //! \param theModel selection model - //! \return container of presentations - NCollection_List SelectedPresentations( - QItemSelectionModel* theModel); - - //! Returns selected shapes - //! \param[out] container of shapes - void SelectedShapes(NCollection_List& theSelPresentations); - -private: - //! Fills controls of the plugin by parameters: - //! - Fine AIS_InteractiveObject and fills View if it if it differs from the current context - //! \param theParameters a parameters container - bool Init(const NCollection_List& theParameters); - - //! Read BREP file, creates AIS presentation for the shape and visualize it in the current context - //! \param theFileName a name of BREP file - bool OpenFile(const TCollection_AsciiString& theFileName); - -private slots: - - //! Shows context menu for tree view selected item. It contains clear view or BREP operations - //! items \param thePosition a clicked point - void onTreeViewContextMenuRequested(const QPoint& thePosition); - - //! Performs the functionality of the clicked action - //! \param theActionId an action identifier in tool bar - void onToolBarActionClicked(const int theActionId); - - //! Display content of selected tree view item if isToggled is true - //! \param isToggled true if the property dock widget is shown - void onPropertyPanelShown(bool isToggled); - - //! Processes selection in tree view: make presentation or owner selected in the context if - //! corresponding check box is checked \param theSelected a selected items \param theDeselected a - //! deselected items - void onTreeViewSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - - //! Exports the first selected shape into ShapeViewer plugin. - void onExportToShapeView(); - - //! Appends lights into the active V3d view - void onAddLight(); - - //! Removes selected light from the active V3d view - void onRemoveLight(); - - //! Switch On/Off for selected light - void onOnOffLight(); - - //! Apply activated display action - void onDisplayActionTypeClicked(); - - //! Expand two next levels for all selected item - void onExpand(); - - //! Expand all levels for all selected items - void onExpandAll(); - - //! Collapse all levels for all selected items - void onCollapseAll(); - -private: - //! Inits the window content by the given context - //! \param theContext a context - void SetContext(const Handle(AIS_InteractiveContext)& theContext); - - //! Updates tree model - void UpdateTreeModel(); - - //! Set selected in tree view presentations displayed or erased in the current context. Note that - //! erased presentations still belongs to the current context until Remove is called. \param - //! theType display action type - void displaySelectedPresentations(const View_DisplayActionType theType); - - //! Set items of the pointers highlighted in tree view - //! \param theType display action type - void highlightTreeViewItems(const QStringList& thePointers); - - //! Set items of the pointers selected in tree view - //! \param theType display action type - void selectTreeViewItems(const QStringList& thePointers); - - //! Returns displayer where the presentations/preview should be shown/erased - //! If default view is created, it returns displayer of this view - Standard_EXPORT View_Displayer* displayer(); - - //! Creates an instance of 3D view to initialize context. - //! \return a context of created view. - Handle(AIS_InteractiveContext) createView(); - - //! Creates a new default light into V3d viewer - //! \param theSourceLight type of light source - //! \param theViewer viewer to add the created light - void addLight(const Graphic3d_TypeOfLightSource& theSourceLight, - const Handle(V3d_Viewer)& theViewer); - -private: - QWidget* myParent; //!< widget, comes when Init window, the window control lays in the layout, - //!< updates window title - - QMainWindow* myMainWindow; //!< main control - VInspector_ToolBar* myToolBar; //!< tool bar actions - - QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget - ViewControl_PropertyView* - myPropertyView; //!< property control to display model item values if exist - - QTreeView* myTreeView; //!< tree view of AIS content - - ViewControl_MessageDialog* - myExportToShapeViewDialog; //!< dialog about exporting TopoDS_Shape to ShapeView plugin - View_Window* myViewWindow; //!< temporary view window, it is created if Open is called but context - //!< is still NULL - - Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container - - View_Displayer* - myDisplayer; //!< class to display presentations/preview if myMainWindow is not used -}; - -#endif diff --git a/tools/VInspector/icons/treeview_and.png b/tools/VInspector/icons/treeview_and.png deleted file mode 100644 index cd188ad1dc83d303add776ac6d684219ce39fd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 604 zcmV-i0;BzjP)Dtr!5r9ZHf8X3yZr*JR4Q^`)3nF!=kG8a4$GuS zB*IK4!)P>WsO+}#`TW0uBw4T5sj8|WSqQ;gF30ov%wDf2{hdz702B{H`Gp7Rx(-EA q9^KF66+#@uy@#awPUbV+zW+bO+1C=2Qh`ta0000*DYs6nosN!y~%w=vQhHIB>$7QU$~Y% zU}9qsw4CJq^4QfTp+k=^SiiqNZv|WQh6Sv;83*NA7H6G_^}o8lnR`R(;p|UJ<}Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1L8?UK~y+TV;~YR zLNWQkBX=Tu_Pk@dg`2J<=4`uHAG!8!mGk_|!NwiC%c7oYv|l0g009HHpNd?3X#g)2GDs@FQ%$JcX!b)x{F z&B?QOI~4D`e>(Bt>u*+@UVM{W`1}v&gs1!04LVXr4G_;|kyI)f04b`;){II>UKlW|Xrvn~Jrsg}kww29V1Q#4JF} z48*J)%5Jh;E*%$>I0%pdC>B8m zV2e#gVPSP%Zs)o}=BTxA8PfIv4LkOqq2|tihPGG#*^16!HIN|S)-f07h?}*Aq3-m5 zhVHBX8K&I*&#>^#f40s`M+J>T`Ju{)1Cqu*Ts$$ol}rtXJ~2$Z_Mc$}&~*zQ{byYL z@;~R~vls?4g_hJy_?NdUnCG`EsHe9p$j8?!h{sebiu>m)i0kQbi)fgt@pu*Va3u81 z;z*t_lOuh~bdKy9Q@IM~Oc6@yDv*(};DnmRz~Jf{!(F)b_-gNCPwwk%et2JU(cSwz z6RzH8t2uF>J8{+;aea3MpfXVSf;53JD9wQ|I}o!0F(?8NK;18i*K+HOVvB?f;B1r~j}At==f=(X0$qhBZ0K z+sA{vj+(bYE@UgceuSaq%|E8h$G;d-AO2@ZxbmMN>d1e_(4BwT0+t;S@b2-Ga;^~8 z(h6k*86s(&CMRN%9wuuN;>TcY%nCIM0+d|J`Pnnh9AQg3eU>L+X$4F4(fbV1C;l@; z?ElXYy6rzh$j1N7!K*&91us0#=|6oHyI1dKcIU>6JZ5S0`Q^+MfkvRZUd5xHPcUlD zBtfr*E;0JA{KF8m`aeS?(9nbf{~1z_{%1@+^p7QK?Hew~iYe@} zMxda;Qk2=-vxvJEivd}%*kt85O)=ndZth|CnsAOKc+qo~_^mHlQ}*8Ch+V&$+odLq zS4u+|sE(vUmytnIl8ax>Rgu>;){@6G$&OpsUze9x3S - - icons/keep_view_off.png - icons/keep_view_on.png - icons/trihedron.png - icons/view_clear.png - icons/view_cube.png - icons/view_dm_shading.png - icons/view_dm_wireframe.png - icons/view_fitall.png - - - diff --git a/tools/View/View_ContextType.hxx b/tools/View/View_ContextType.hxx deleted file mode 100644 index 826fbe59d2..0000000000 --- a/tools/View/View_ContextType.hxx +++ /dev/null @@ -1,28 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_ConextType_H -#define View_ConextType_H - -//! Type of context used in a tool library -enum View_ContextType -{ - View_ContextType_Own, //!< View widget context is used - View_ContextType_None, //!< no context (is useful if visualization is not needed, for better - //!< performance) - View_ContextType_External //!< context is set from outside -}; - -#endif diff --git a/tools/View/View_DisplayActionType.hxx b/tools/View/View_DisplayActionType.hxx deleted file mode 100644 index b5d03d57de..0000000000 --- a/tools/View/View_DisplayActionType.hxx +++ /dev/null @@ -1,29 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_DisplayActionType_H -#define View_DisplayActionType_H - -//! \enum View_DisplayActionType -enum View_DisplayActionType -{ - View_DisplayActionType_NoneId, //!< No action activated - View_DisplayActionType_DisplayId, //!< Display action - View_DisplayActionType_RedisplayId, //!< Redisplay action - View_DisplayActionType_EraseId, //!< Erase action - View_DisplayActionType_RemoveId //!< Remove action -}; - -#endif diff --git a/tools/View/View_DisplayPreview.cxx b/tools/View/View_DisplayPreview.cxx deleted file mode 100644 index ccd1f361c7..0000000000 --- a/tools/View/View_DisplayPreview.cxx +++ /dev/null @@ -1,163 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -static void enableGlobalClipping(const Handle(AIS_InteractiveObject)& theObject, - const bool theIsEnable) -{ - if (theIsEnable) - { - theObject->SetClipPlanes(Handle(Graphic3d_SequenceOfHClipPlane)()); - } - else - { - Handle(Graphic3d_SequenceOfHClipPlane) aPlanes = new Graphic3d_SequenceOfHClipPlane(); - aPlanes->SetOverrideGlobal(Standard_True); - theObject->SetClipPlanes(aPlanes); - } -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -View_DisplayPreview::View_DisplayPreview() -{ - myPreviewParameters = new View_PreviewParameters(); -} - -// ======================================================================= -// function : SetContext -// purpose : -// ======================================================================= -void View_DisplayPreview::SetContext(const Handle(AIS_InteractiveContext)& theContext) -{ - if (myContext == theContext) - return; - - // remove all preview presentations from the previous context, display it in the new - - myContext = theContext; - if (!theContext.IsNull()) - myPreviewParameters->GetDrawer()->Link(theContext->DefaultDrawer()); -} - -// ======================================================================= -// function : UpdatePreview -// purpose : -// ======================================================================= -void View_DisplayPreview::UpdatePreview( - const View_DisplayActionType, - const NCollection_List& thePresentations) -{ - if (myContext.IsNull()) - return; - - int aPreviewDisplayMode = AIS_Shaded; - - // clear previous previews - for (NCollection_List::Iterator anIterator( - myPreviewReadyPresentations); - anIterator.More(); - anIterator.Next()) - { - if (!anIterator.Value()->GetContext().IsNull()) - anIterator.Value()->GetContext()->Remove(anIterator.Value(), Standard_True); - } - myPreviewReadyPresentations.Clear(); - - if (thePresentations.IsEmpty()) - { - if (!myPreviewPresentation.IsNull() && !myPreviewPresentation->GetContext().IsNull()) - myPreviewPresentation->GetContext()->Remove(myPreviewPresentation, Standard_True); - myPreviewPresentation = NULL; - - return; - } - - // display parameter previews - BRep_Builder aBuilder; - TopoDS_Compound aCompound; - aBuilder.MakeCompound(aCompound); - for (NCollection_List::Iterator anIterator(thePresentations); - anIterator.More(); - anIterator.Next()) - { - if (Handle(Convert_TransientShape) aShapePtr = - Handle(Convert_TransientShape)::DownCast(anIterator.Value())) - { - aBuilder.Add(aCompound, aShapePtr->Shape()); - } - Handle(AIS_InteractiveObject) aPrs = - Handle(AIS_InteractiveObject)::DownCast(anIterator.Value()); - if (!aPrs.IsNull() && aPrs->GetContext().IsNull() /*is not displayed in another context*/) - { - myContext->Display( - aPrs, - aPreviewDisplayMode, - View_DisplayPreview::PreviewSelectionMode() /*participate only in custom selection*/, - Standard_True); - enableGlobalClipping(aPrs, false); - myPreviewReadyPresentations.Append(aPrs); - } - } - - if (myPreviewPresentation.IsNull()) - { - myPreviewPresentation = new AIS_Shape(aCompound); - myPreviewPresentation->Attributes()->SetAutoTriangulation(Standard_False); - - Quantity_Color aColor(Quantity_NOC_TOMATO); - myPreviewPresentation->Attributes()->SetPointAspect( - new Prs3d_PointAspect(Aspect_TOM_O_PLUS, aColor, 3.0)); - myPreviewPresentation->SetAttributes(myPreviewParameters->GetDrawer()); - - myContext->Display( - myPreviewPresentation, - aPreviewDisplayMode, - View_DisplayPreview::PreviewSelectionMode() /*participate only in custom selection*/, - Standard_True); - enableGlobalClipping(myPreviewPresentation, false); - } - else - { - Handle(AIS_Shape)::DownCast(myPreviewPresentation)->Set(aCompound); - if (!myPreviewPresentation->GetContext().IsNull()) - { - myPreviewPresentation->GetContext()->Redisplay(myPreviewPresentation, Standard_True); - } - } -} diff --git a/tools/View/View_DisplayPreview.hxx b/tools/View/View_DisplayPreview.hxx deleted file mode 100644 index c51349cc53..0000000000 --- a/tools/View/View_DisplayPreview.hxx +++ /dev/null @@ -1,78 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_DisplayPreview_H -#define View_DisplayPreview_H - -#include - -#include -#include -#include -#include - -class AIS_InteractiveObject; -class View_PreviewParameters; - -//! \class View_DisplayPreview -//! \brief It is responsible for communication with AIS Interactive Context to: -//! - display/erase presentations; -//! - change display mode of visualized presentations (Shaded or WireFrame mode) -//! -//! It contains containers of visualized presentations to obtain presentations relating only to this -//! displayer. Displayer is connected to AIS Interactive Context -class View_DisplayPreview -{ -public: - //! Constructor - Standard_EXPORT View_DisplayPreview(); - - //! Destructor - virtual ~View_DisplayPreview() {} - - //! Stores the current context where the presentations will be displayed/erased. - //! Erases previously displayed presentations if there were some displayed - //! \param theContext a context instance - Standard_EXPORT void SetContext(const Handle(AIS_InteractiveContext)& theContext); - - //! Returns preview parameters - View_PreviewParameters* GetPreviewParameters() const { return myPreviewParameters; } - - //! Updates visibility of the presentations for the display type - Standard_EXPORT void UpdatePreview( - const View_DisplayActionType theType, - const NCollection_List& thePresentations); - - //! Returns true if preview presentation is shown - Standard_Boolean HasPreview() const { return !myPreviewPresentation.IsNull(); } - - //! Custom preview selection mode - static Standard_Integer PreviewSelectionMode() { return 100; } - -private: - //! Returns the current context - const Handle(AIS_InteractiveContext)& GetContext() const { return myContext; } - -private: - Handle(AIS_InteractiveContext) myContext; //!< context, where the displayer works - - View_PreviewParameters* myPreviewParameters; //!< drawer of preview presentation - Handle(AIS_InteractiveObject) - myPreviewPresentation; //!< presentation of preview for a selected object - NCollection_List - myPreviewReadyPresentations; //!< presentation of preview for a selected object -}; - -#endif diff --git a/tools/View/View_Displayer.cxx b/tools/View/View_Displayer.cxx deleted file mode 100644 index 6da2e0e8b4..0000000000 --- a/tools/View/View_Displayer.cxx +++ /dev/null @@ -1,436 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -View_Displayer::View_Displayer() - : myIsKeepPresentations(false), - myFitAllActive(false), - myDisplayMode(0) -{ - myDisplayPreview = new View_DisplayPreview(); -} - -// ======================================================================= -// function : SetContext -// purpose : -// ======================================================================= -void View_Displayer::SetContext(const Handle(AIS_InteractiveContext)& theContext) -{ - NCollection_DataMap> aDisplayed = - myDisplayed; - EraseAllPresentations(true); - myContext = theContext; - - for (NCollection_DataMap>::Iterator - aDisplayedIt(aDisplayed); - aDisplayedIt.More(); - aDisplayedIt.Next()) - { - View_PresentationType aType = aDisplayedIt.Key(); - for (AIS_ListIteratorOfListOfInteractive aPresentationsIt(aDisplayedIt.Value()); - aPresentationsIt.More(); - aPresentationsIt.Next()) - DisplayPresentation(aPresentationsIt.Value(), aType, false); - } - myDisplayPreview->SetContext(theContext); - UpdateViewer(); -} - -// ======================================================================= -// function : SetDisplayMode -// purpose : -// ======================================================================= -void View_Displayer::SetDisplayMode(const int theDisplayMode, - const View_PresentationType theType, - const bool theToUpdateViewer) -{ - myDisplayMode = theDisplayMode; - if (GetContext().IsNull()) - return; - - NCollection_Shared aDisplayed; - DisplayedPresentations(aDisplayed, theType); - - for (AIS_ListIteratorOfListOfInteractive aDisplayedIt(aDisplayed); aDisplayedIt.More(); - aDisplayedIt.Next()) - GetContext()->SetDisplayMode(aDisplayedIt.Value(), theDisplayMode, Standard_False); - - if (theToUpdateViewer) - UpdateViewer(); -} - -// ======================================================================= -// function : DisplayPresentation -// purpose : -// ======================================================================= -void View_Displayer::DisplayPresentation(const Handle(Standard_Transient)& thePresentation, - const View_PresentationType theType, - const bool theToUpdateViewer) -{ - if (GetContext().IsNull()) - return; - - NCollection_Shared aDisplayed; - DisplayedPresentations(aDisplayed, theType); - if (!myIsKeepPresentations) - ErasePresentations(theType, false); - - Handle(AIS_InteractiveObject) aPresentation = - Handle(AIS_InteractiveObject)::DownCast(thePresentation); - if (!aPresentation.IsNull() && aPresentation->GetContext().IsNull()) - { - // one presentation can not be shown in several contexts - if (theType == View_PresentationType_Additional) - { - Quantity_Color aColor; - if (myColorAttributes.Find(View_PresentationType_Additional, aColor)) - aPresentation->SetColor(aColor); - } - GetContext()->Display(aPresentation, false); - if (myDisplayMode != -1) - GetContext()->SetDisplayMode(aPresentation, myDisplayMode, false); - aDisplayed.Append(aPresentation); - } - - if (myFitAllActive) - fitAllView(); - - myDisplayed.Bind(theType, aDisplayed); - - if (theToUpdateViewer) - UpdateViewer(); -} - -// ======================================================================= -// function : RedisplayPresentation -// purpose : -// ======================================================================= -void View_Displayer::RedisplayPresentation(const Handle(Standard_Transient)& thePresentation, - const bool theToUpdateViewer) -{ - Handle(AIS_InteractiveObject) aPresentation = - Handle(AIS_InteractiveObject)::DownCast(thePresentation); - if (aPresentation.IsNull() || aPresentation->GetContext().IsNull()) - return; - - GetContext()->Redisplay(aPresentation, false); - - if (myFitAllActive) - fitAllView(); - - if (theToUpdateViewer) - UpdateViewer(); -} - -// ======================================================================= -// function : EraseAllPresentations -// purpose : -// ======================================================================= -void View_Displayer::EraseAllPresentations(const bool theToUpdateViewer) -{ - for (NCollection_DataMap>::Iterator - aDisplayedIt(myDisplayed); - aDisplayedIt.More(); - aDisplayedIt.Next()) - ErasePresentations(aDisplayedIt.Key(), false); - - if (theToUpdateViewer) - UpdateViewer(); -} - -// ======================================================================= -// function : ErasePresentations -// purpose : -// ======================================================================= -void View_Displayer::ErasePresentations(const View_PresentationType theType, - const bool theToUpdateViewer) -{ - if (GetContext().IsNull()) - return; - - NCollection_Shared aDisplayed; - DisplayedPresentations(aDisplayed, theType); - - for (AIS_ListIteratorOfListOfInteractive aDisplayedIt(aDisplayed); aDisplayedIt.More(); - aDisplayedIt.Next()) - { - if (aDisplayedIt.Value()->IsKind(STANDARD_TYPE(AIS_Trihedron))) - continue; - - GetContext()->Remove(aDisplayedIt.Value(), Standard_False); - } - - aDisplayed.Clear(); - myDisplayed.Bind(theType, aDisplayed); - - if (theToUpdateViewer) - UpdateViewer(); -} - -// ======================================================================= -// function : ErasePresentation -// purpose : -// ======================================================================= -void View_Displayer::ErasePresentation(const Handle(Standard_Transient)& thePresentation, - const View_PresentationType theType, - const bool theToUpdateViewer) -{ - if (GetContext().IsNull()) - return; - - Handle(AIS_InteractiveObject) aPresentation = - Handle(AIS_InteractiveObject)::DownCast(thePresentation); - if (aPresentation.IsNull()) - return; - - GetContext()->Remove(aPresentation, Standard_False); - - NCollection_Shared aDisplayed; - DisplayedPresentations(aDisplayed, theType); - aDisplayed.Remove(aPresentation); - myDisplayed.Bind(theType, aDisplayed); - - if (myFitAllActive) - fitAllView(); - - if (theToUpdateViewer) - UpdateViewer(); -} - -// ======================================================================= -// function : DisplayDefaultTrihedron -// purpose : -// ======================================================================= -void View_Displayer::DisplayDefaultTrihedron(const Standard_Boolean toDisplay, - const bool theToUpdateViewer) -{ - const Handle(AIS_Trihedron)& aTrihedron = defaultTrihedron(toDisplay); - if (aTrihedron.IsNull()) - return; - - if (toDisplay) - GetContext()->Display(aTrihedron, theToUpdateViewer); - else - GetContext()->Erase(aTrihedron, theToUpdateViewer); -} - -// ======================================================================= -// function : DisplayViewCube -// purpose : -// ======================================================================= -void View_Displayer::DisplayViewCube(const Standard_Boolean toDisplay, const bool theToUpdateViewer) -{ - if (myViewCube.IsNull() && toDisplay) - { - myViewCube = new AIS_ViewCube(); - myViewCube->SetSize(35.0); - myViewCube->SetBoxColor(Quantity_NOC_GRAY50); - } - - if (myViewCube.IsNull()) - return; - - if (toDisplay) - GetContext()->Display(myViewCube, theToUpdateViewer); - else - GetContext()->Erase(myViewCube, theToUpdateViewer); -} - -// ======================================================================= -// function : SetVisible -// purpose : -// ======================================================================= -void View_Displayer::SetVisible(const TopoDS_Shape& theShape, - const bool theState, - const View_PresentationType theType) -{ - if (theShape.IsNull()) - return; - - if (theState) - DisplayPresentation(CreatePresentation(theShape), View_PresentationType_Main, Standard_False); - else - { - Handle(AIS_InteractiveObject) aPresentation = FindPresentation(theShape, theType); - if (!aPresentation.IsNull()) - ErasePresentation(aPresentation, theType, Standard_False); - } - - UpdateViewer(); -} - -// ======================================================================= -// function : IsVisible -// purpose : -// ======================================================================= -bool View_Displayer::IsVisible(const TopoDS_Shape& theShape, - const View_PresentationType theType) const -{ - Handle(AIS_InteractiveObject) aPresentation = FindPresentation(theShape, theType); - return !aPresentation.IsNull(); -} - -// ======================================================================= -// function : UpdatePreview -// purpose : -// ======================================================================= -void View_Displayer::UpdatePreview( - const View_DisplayActionType theType, - const NCollection_List& thePresentations) -{ - myDisplayPreview->UpdatePreview(theType, thePresentations); - if (myFitAllActive) - fitAllView(); -} - -// ======================================================================= -// function : UpdateViewer -// purpose : -// ======================================================================= -void View_Displayer::UpdateViewer() -{ - if (GetContext().IsNull()) - return; - - GetContext()->UpdateCurrentViewer(); -} - -// ======================================================================= -// function : SetAttributeColor -// purpose : -// ======================================================================= -void View_Displayer::SetAttributeColor(const Quantity_Color& theColor, - const View_PresentationType theType) -{ - myColorAttributes.Bind(theType, theColor); -} - -// ======================================================================= -// function : DisplayedPresentations -// purpose : -// ======================================================================= -void View_Displayer::DisplayedPresentations( - NCollection_Shared& thePresentations, - const View_PresentationType theType) const -{ - myDisplayed.Find(theType, thePresentations); -} - -// ======================================================================= -// function : getView -// purpose : -// ======================================================================= -Handle(V3d_View) View_Displayer::GetView() const -{ - Handle(V3d_View) aView; - if (GetContext().IsNull()) - return aView; - - const Handle(V3d_Viewer)& aViewer = GetContext()->CurrentViewer(); - if (!aViewer.IsNull()) - { - if (!aViewer->ActiveViews().IsEmpty()) - { - aView = aViewer->ActiveViews().First(); - } - } - return aView; -} - -// ======================================================================= -// function : FindPresentation -// purpose : -// ======================================================================= -Handle(AIS_InteractiveObject) View_Displayer::FindPresentation( - const TopoDS_Shape& theShape, - const View_PresentationType theType) const -{ - if (theShape.IsNull()) - return Handle(AIS_InteractiveObject)(); - - NCollection_Shared aDisplayed; - DisplayedPresentations(aDisplayed, theType); - - for (AIS_ListIteratorOfListOfInteractive aDisplayedIt(aDisplayed); aDisplayedIt.More(); - aDisplayedIt.Next()) - { - Handle(AIS_Shape) aPresentation = Handle(AIS_Shape)::DownCast(aDisplayedIt.Value()); - if (aPresentation->Shape().IsEqual(theShape)) - return aPresentation; - } - - return Handle(AIS_InteractiveObject)(); -} - -// ======================================================================= -// function : CreatePresentation -// purpose : -// ======================================================================= -Handle(Standard_Transient) View_Displayer::CreatePresentation(const TopoDS_Shape& theShape) -{ - Handle(AIS_Shape) aPresentation = new AIS_Shape(theShape); - aPresentation->Attributes()->SetAutoTriangulation(Standard_False); - - return aPresentation; -} - -// ======================================================================= -// function : fitAllView -// purpose : -// ======================================================================= -void View_Displayer::fitAllView() -{ - Handle(V3d_View) aView = GetView(); - if (!aView.IsNull()) - { - aView->FitAll(); - aView->Redraw(); - } -} - -// ======================================================================= -// function : defaultTrihedron -// purpose : -// ======================================================================= -const Handle(AIS_Trihedron)& View_Displayer::defaultTrihedron(const bool toCreate) -{ - if (myDefaultTrihedron.IsNull() && toCreate) - { - myDefaultTrihedron = new AIS_Trihedron(new Geom_Axis2Placement(gp::XOY())); - myDefaultTrihedron->SetSize(1); - } - return myDefaultTrihedron; -} diff --git a/tools/View/View_Displayer.hxx b/tools/View/View_Displayer.hxx deleted file mode 100644 index 894b5db88f..0000000000 --- a/tools/View/View_Displayer.hxx +++ /dev/null @@ -1,225 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_Displayer_H -#define View_Displayer_H - -#include -#include - -#include -#include -#include -#include - -#include -#include - -class AIS_Trihedron; -class AIS_ViewCube; -class V3d_View; -class View_DisplayPreview; - -//! \class View_Displayer -//! \brief It is responsible for communication with AIS Interactive Context to: -//! - display/erase presentations; -//! - change display mode of visualized presentations (Shaded or WireFrame mode) -//! -//! It contains containers of visualized presentations to obtain presentations relating only to this -//! displayer. Displayer is connected to AIS Interactive Context -class View_Displayer -{ -public: - //! Constructor - Standard_EXPORT View_Displayer(); - - //! Destructor - virtual ~View_Displayer() {} - - //! Returns preview display instance - View_DisplayPreview* DisplayPreview() const { return myDisplayPreview; } - - //! Stores the current context where the presentations will be displayed/erased. - //! Erases previously displayed presentations if there were some displayed - //! \param theContext a context instance - Standard_EXPORT void SetContext(const Handle(AIS_InteractiveContext)& theContext); - - //! Stores boolean value if presentations should be keeped. If true, new displayed presentation is - //! added to already displayed ones, otherwise the displayed presentation is shown only. \param - //! theToKeepPresentation boolean state - void KeepPresentations(const bool theToKeepPresentations) - { - myIsKeepPresentations = theToKeepPresentations; - } - - //! Returns true if fit Fit All should be performed automatically by each Display - bool IsFitAllActive() const { return myFitAllActive; } - - //! Stores flag whether the FitAll should be done automatically for each display - //! \param theFitAllActive boolean value - void SetFitAllActive(const bool theFitAllActive) { myFitAllActive = theFitAllActive; } - - //! Returns current display mode: 0 - AIS_WireFrame, 1 - AIS_Shaded - int DisplayMode() const { return myDisplayMode; } - - //! Stores display mode and changes display mode of displayed presentations - //! \param theDisplayMode a mode: 0 - AIS_WireFrame, 1 - AIS_Shaded - //! \param theType presentation type - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void SetDisplayMode( - const int theDisplayMode, - const View_PresentationType theType = View_PresentationType_Main, - const bool theToUpdateViewer = true); - - //! Displays presentation in context, erase previous presentations if KeepPresentations is false, - //! Color of presentation is from attribute color if exists or the default color - //! Display mode is equal to the view state - //! If KeepPresentations is false, the viewer is fit all - //! Displayed presentation is stored in an internal map of displayed presentations - //! \param thePresentation a presentation, it will be casted to AIS_InteractiveObject - //! \param theType presentation type - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void DisplayPresentation( - const Handle(Standard_Transient)& thePresentation, - const View_PresentationType theType = View_PresentationType_Main, - const bool theToUpdateViewer = true); - - //! Redisplays the parameter presentation in current context - //! \param thePresentation a presentation, it will be casted to AIS_InteractiveObject - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void RedisplayPresentation(const Handle(Standard_Transient)& thePresentation, - const bool theToUpdateViewer = true); - - //! Erases all presentations from viewer. Iterates by internal map of displayed presentations and - //! erase these presentations. - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void EraseAllPresentations(const bool theToUpdateViewer = true); - - //! Erases presentations of the given type - //! \param theType presentation type - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void ErasePresentations( - const View_PresentationType theType = View_PresentationType_Main, - const bool theToUpdateViewer = true); - - //! Erases presentation from viewer - //! \param thePresentation a presentation, it will be casted to AIS_InteractiveObject - //! \param theType presentation type - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void ErasePresentation( - const Handle(Standard_Transient)& thePresentation, - const View_PresentationType theType = View_PresentationType_Main, - const bool theToUpdateViewer = true); - - //! Displays presentation of default trihedron, create it by the first call - //! \param toDisplay flag to display presentation if true, or erase it - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void DisplayDefaultTrihedron(const Standard_Boolean toDisplay, - const bool theToUpdateViewer); - - //! Displays presentation of view cube, create it by the first call - //! \param toDisplay flag to display presentation if true, or erase it - //! \param isToUpdateView boolean state if viewer should be updated - Standard_EXPORT void DisplayViewCube(const Standard_Boolean toDisplay, - const bool theToUpdateViewer); - - //! Sets shape visible/invisible - //! \theShape shape instance - //! \theState visibility state - Standard_EXPORT void SetVisible(const TopoDS_Shape& theShape, - const bool theState, - const View_PresentationType theType = View_PresentationType_Main); - - //! Returns visibility state value - //! \theShape shape instance - Standard_EXPORT bool IsVisible( - const TopoDS_Shape& theShape, - const View_PresentationType theType = View_PresentationType_Main) const; - - //! Updates visibility of the presentations for the display type - Standard_EXPORT void UpdatePreview( - const View_DisplayActionType theType, - const NCollection_List& thePresentations); - - //! Calls UpdateCurrentViewer of context - Standard_EXPORT void UpdateViewer(); - - //! Stores color for type of presentation. During display of presentation of the given type, the - //! color is used \param theColor a presentation color \param theType presentation type - Standard_EXPORT void SetAttributeColor( - const Quantity_Color& theColor, - const View_PresentationType theType = View_PresentationType_Main); - - //! Returns container of displayed presentations for the given type - //! \param thePresentations a container to be filled - //! \param theType presentation type - Standard_EXPORT void DisplayedPresentations( - NCollection_Shared& thePresentations, - const View_PresentationType theType = View_PresentationType_Main) const; - - //! Returns all displayed by the trihedron objects - const NCollection_DataMap>& - GetDisplayed() const - { - return myDisplayed; - } - - //! Returns presentation if there is displayed AIS_Shape presentation for the parameter shape - //! \param theShape a shape instance - //! \param theType presentation type - //! \return presentation instance or NULL - Standard_EXPORT Handle(AIS_InteractiveObject) FindPresentation( - const TopoDS_Shape& theShape, - const View_PresentationType theType = View_PresentationType_Main) const; - - //! Creates AIS_Shape for the shape - //! \param theShape a shape - //! \return presentation - Standard_EXPORT static Handle(Standard_Transient) CreatePresentation( - const TopoDS_Shape& theShape); - -private: - //! Returns the current context - const Handle(AIS_InteractiveContext)& GetContext() const { return myContext; } - - //! Returns 3d view - Handle(V3d_View) GetView() const; - - //! Fits all view - void fitAllView(); - - //! Returns default trihedron, create it if flag allows - //! \param toCreate boolean state if trihedron should be created if it is NULL - const Handle(AIS_Trihedron)& defaultTrihedron(const bool toCreate); - -private: - View_DisplayPreview* myDisplayPreview; //!< class for preview display - - Handle(AIS_InteractiveContext) myContext; //!< context, where the displayer works - Handle(AIS_Trihedron) myDefaultTrihedron; //!< trihedron presentation for the current context - Handle(AIS_ViewCube) myViewCube; //!< view cube presentation for current context - - NCollection_DataMap> - myDisplayed; //!< visualized presentations - NCollection_DataMap - myColorAttributes; //!< color properties of presentations - - bool myIsKeepPresentations; //!< flag if previously shown presentations stays in the context by - //!< displaying a new one - bool myFitAllActive; //!< flag if Fit All should be performed automatically by each Display - int myDisplayMode; //!< display mode: 0 - AIS_WireFrame, 1 - AIS_Shaded -}; - -#endif diff --git a/tools/View/View_PresentationType.hxx b/tools/View/View_PresentationType.hxx deleted file mode 100644 index 1593a58bbb..0000000000 --- a/tools/View/View_PresentationType.hxx +++ /dev/null @@ -1,26 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_PresentationType_H -#define View_PresentationType_H - -//! Type of displayed presentation in View displayed in AIS_InteractiveContext -enum View_PresentationType -{ - View_PresentationType_Main, //!< general presentation, mostly used - View_PresentationType_Additional //!< additional presentation -}; - -#endif diff --git a/tools/View/View_PreviewParameters.cxx b/tools/View/View_PreviewParameters.cxx deleted file mode 100644 index e1597e25c9..0000000000 --- a/tools/View/View_PreviewParameters.cxx +++ /dev/null @@ -1,57 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -View_PreviewParameters::View_PreviewParameters(const Standard_Boolean theToTransparent) -{ - myDrawer = new Prs3d_Drawer(); - - Quantity_Color aColor(Quantity_NOC_TOMATO); - - // point parameters - myDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_O_PLUS, aColor, 3.0)); - - // shading parameters - Graphic3d_MaterialAspect aShadingMaterial; - aShadingMaterial.SetMaterialType(Graphic3d_MATERIAL_ASPECT); - - myDrawer->SetShadingAspect(new Prs3d_ShadingAspect()); - myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle(Aspect_IS_SOLID); - myDrawer->ShadingAspect()->SetColor(aColor); - myDrawer->ShadingAspect()->SetMaterial(aShadingMaterial); - - myDrawer->SetLineAspect(new Prs3d_LineAspect(aColor, Aspect_TOL_SOLID, 1.)); - - if (theToTransparent) - { - Standard_ShortReal aTransparency = 0.8f; - - myDrawer->ShadingAspect()->Aspect()->ChangeFrontMaterial().SetTransparency(aTransparency); - myDrawer->ShadingAspect()->Aspect()->ChangeBackMaterial().SetTransparency(aTransparency); - myDrawer->SetTransparency(aTransparency); - } - // common parameters - myDrawer->SetZLayer(Graphic3d_ZLayerId_Topmost); -} diff --git a/tools/View/View_PreviewParameters.hxx b/tools/View/View_PreviewParameters.hxx deleted file mode 100644 index 81bd34e360..0000000000 --- a/tools/View/View_PreviewParameters.hxx +++ /dev/null @@ -1,80 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_PreviewParameters_H -#define View_PreviewParameters_H - -#include -#include - -#include - -#include -#include -#include -#include - -//! \class View_PreviewParameters -//! Container of View tool bar actions -class View_PreviewParameters -{ -public: - //! Constructor - Standard_EXPORT View_PreviewParameters(const Standard_Boolean theToTransparent = Standard_True); - - //! Destructor - virtual ~View_PreviewParameters() {} - - //! Returns main control - const Handle(Prs3d_Drawer)& GetDrawer() const { return myDrawer; } - - //! Saves state of preview parameters in a container in form: key, value. It saves: - //! - visibility of columns, - //! - columns width - //! \param theTreeView a view instance - //! \param[out] theItems properties - //! \param thePrefix preference item prefix - static void SaveState(View_PreviewParameters* theParameters, - QMap& theItems, - const QString& thePrefix = QString()) - { - (void)theParameters; - (void)theItems; - (void)thePrefix; - } - - //! Restores state of preview parameters by a container - //! \param theTreeView a view instance - //! \param theKey property key - //! \param theValue property value - //! \param thePrefix preference item prefix - //! \return boolean value whether the property is applied to the tree view - static bool RestoreState(View_PreviewParameters* theParameters, - const QString& theKey, - const QString& theValue, - const QString& thePrefix = QString()) - { - (void)theParameters; - (void)theKey; - (void)theValue; - (void)thePrefix; - return false; - } - -private: - Handle(Prs3d_Drawer) myDrawer; //!< attributes for preview presentation -}; - -#endif diff --git a/tools/View/View_ToolActionType.hxx b/tools/View/View_ToolActionType.hxx deleted file mode 100644 index e5797c7eec..0000000000 --- a/tools/View/View_ToolActionType.hxx +++ /dev/null @@ -1,29 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_ToolActionType_H -#define View_ToolActionType_H - -//! Actions of view tool bar -enum View_ToolActionType -{ - View_ToolActionType_KeepViewId, //!< Do not clear previously shown presentations - View_ToolActionType_KeepViewOffId, //!< Do show only for new displayed presentation - View_ToolActionType_ClearViewId, //!< Erase all displayed presentations - View_ToolActionType_Trihedron, //!< Display/Erase trihedron presentation - View_ToolActionType_ViewCube //!< Display/Erase view cube presentation -}; - -#endif diff --git a/tools/View/View_ToolBar.cxx b/tools/View/View_ToolBar.cxx deleted file mode 100644 index b7598f9b8e..0000000000 --- a/tools/View/View_ToolBar.cxx +++ /dev/null @@ -1,245 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include - -const int DEFAULT_COMBO_WIDTH_MINIMUM = 80; -const int DEFAULT_SPACING = 3; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -View_ToolBar::View_ToolBar(QWidget* theParent, const bool isUseKeepView) - : QObject(theParent), - myDefaultContextType(-1) -{ - myMainWindow = new QWidget(theParent); - - QHBoxLayout* aLay = new QHBoxLayout(myMainWindow); - aLay->setContentsMargins(0, 0, 0, 0); - aLay->setSpacing(DEFAULT_SPACING); - - QWidget* aViewSelectorWidget = new QWidget(myMainWindow); - QHBoxLayout* aViewSelectorLay = new QHBoxLayout(aViewSelectorWidget); - aViewSelectorLay->setContentsMargins(0, 0, 0, 0); - aViewSelectorLay->setContentsMargins(0, 0, 0, 0); - aViewSelectorLay->addWidget(new QLabel(tr("Context: "), aViewSelectorWidget)); - myViewSelector = new QComboBox(aViewSelectorWidget); - myViewSelector->setMinimumWidth(DEFAULT_COMBO_WIDTH_MINIMUM); - aViewSelectorLay->addWidget(myViewSelector); - aLay->addWidget(aViewSelectorWidget); - connect(myViewSelector, SIGNAL(activated(int)), this, SIGNAL(contextChanged())); - - myViewContextNames[View_ContextType_None] = tr("None"); - myViewContextNames[View_ContextType_Own] = tr("Own"); - myViewContextNames[View_ContextType_External] = tr("External"); - - myViewSelector->insertItem(View_ContextType_None, myViewContextNames[View_ContextType_None]); - myViewSelector->insertItem(View_ContextType_Own, myViewContextNames[View_ContextType_Own]); - - myViewSelector->setCurrentIndex(View_ContextType_Own); - myViewContexts[View_ContextType_None] = Handle(AIS_InteractiveContext)(); - myViewContexts[View_ContextType_Own] = Handle(AIS_InteractiveContext)(); - myViewContexts[View_ContextType_External] = Handle(AIS_InteractiveContext)(); - - myActionsMap[View_ToolActionType_Trihedron] = new QToolButton(theParent); - myActionsMap[View_ToolActionType_Trihedron]->setIcon(QIcon(":/icons/trihedron.png")); - myActionsMap[View_ToolActionType_Trihedron]->setToolTip(tr("Trihedron display")); - myActionsMap[View_ToolActionType_Trihedron]->setCheckable(true); - myActionsMap[View_ToolActionType_Trihedron]->setChecked(false); - - myActionsMap[View_ToolActionType_ViewCube] = new QToolButton(theParent); - myActionsMap[View_ToolActionType_ViewCube]->setIcon(QIcon(":/icons/view_cube.png")); - myActionsMap[View_ToolActionType_ViewCube]->setToolTip(tr("View Cube display")); - myActionsMap[View_ToolActionType_ViewCube]->setCheckable(true); - myActionsMap[View_ToolActionType_ViewCube]->setChecked(false); - - if (isUseKeepView) - { - myActionsMap[View_ToolActionType_KeepViewId] = new QToolButton(theParent); - myActionsMap[View_ToolActionType_KeepViewId]->setIcon(QIcon(":/icons/keep_view_on.png")); - myActionsMap[View_ToolActionType_KeepViewId]->setText(tr("Multi")); - myActionsMap[View_ToolActionType_KeepViewId]->setToolTip( - tr("Keep View On: does not clear previously shown presentation")); - myActionsMap[View_ToolActionType_KeepViewId]->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - myActionsMap[View_ToolActionType_KeepViewId]->setCheckable(true); - myActionsMap[View_ToolActionType_KeepViewId]->setChecked(false); - - myActionsMap[View_ToolActionType_KeepViewOffId] = new QToolButton(theParent); - myActionsMap[View_ToolActionType_KeepViewOffId]->setIcon(QIcon(":/icons/keep_view_off.png")); - myActionsMap[View_ToolActionType_KeepViewOffId]->setText(QObject::tr("Single")); - myActionsMap[View_ToolActionType_KeepViewOffId]->setToolButtonStyle( - Qt::ToolButtonTextBesideIcon); - myActionsMap[View_ToolActionType_KeepViewOffId]->setToolTip( - tr("Keep View Off: clear previously shown presentation")); - myActionsMap[View_ToolActionType_KeepViewOffId]->setCheckable(true); - myActionsMap[View_ToolActionType_KeepViewOffId]->setChecked(true); - - myActionsMap[View_ToolActionType_ClearViewId] = new QToolButton(theParent); - myActionsMap[View_ToolActionType_ClearViewId]->setIcon(QIcon(":/icons/view_clear.png")); - myActionsMap[View_ToolActionType_ClearViewId]->setText(tr("Clear View")); - myActionsMap[View_ToolActionType_ClearViewId]->setToolTip( - tr("Remove all visualized presentations from view context")); - } - - for (QMap::ConstIterator anActionsIt = myActionsMap.begin(), - anActionsLast = myActionsMap.end(); - anActionsIt != anActionsLast; - anActionsIt++) - { - QToolButton* aBtn = anActionsIt.value(); - connect(aBtn, SIGNAL(clicked()), this, SLOT(onActionClicked())); - aLay->addWidget(aBtn); - } - aLay->addStretch(1); -} - -// ======================================================================= -// function : SetContext -// purpose : -// ======================================================================= -void View_ToolBar::SetContext(View_ContextType theType, - const Handle(AIS_InteractiveContext)& theContext) -{ - myViewContexts[theType] = theContext; - - QString aViewContextName = myViewContextNames[theType]; - if (!theContext.IsNull()) - aViewContextName = QString("%1 : [%2]") - .arg(myViewContextNames[theType]) - .arg(Standard_Dump::GetPointerInfo(theContext, true).ToCString()); - // there are only "Own" and "None" items - if (!theContext.IsNull() && theType == View_ContextType_External && myViewSelector->count() == 2) - myViewSelector->insertItem(View_ContextType_External, aViewContextName); - else - myViewSelector->setItemText(theType, aViewContextName); - - if (myDefaultContextType >= 0 && myViewSelector->count() > myDefaultContextType) - { - // using default type during the first setting the external context - myViewSelector->setCurrentIndex(myDefaultContextType); - myDefaultContextType = -1; - } -} - -// ======================================================================= -// function : CurrentContextType -// purpose : -// ======================================================================= -View_ContextType View_ToolBar::CurrentContextType() const -{ - return (View_ContextType)myViewSelector->currentIndex(); -} - -// ======================================================================= -// function : SetCurrentContext -// purpose : -// ======================================================================= -void View_ToolBar::SetCurrentContextType(View_ContextType theType) -{ - myViewSelector->setCurrentIndex((int)theType); - emit contextChanged(); -} - -// ======================================================================= -// function : CurrentContext -// purpose : -// ======================================================================= -Handle(AIS_InteractiveContext) View_ToolBar::CurrentContext() const -{ - View_ContextType aCurrentType = (View_ContextType)myViewSelector->currentIndex(); - return myViewContexts[aCurrentType]; -} - -// ======================================================================= -// function : IsActionChecked -// purpose : -// ======================================================================= -bool View_ToolBar::IsActionChecked(const int theActionId) const -{ - View_ToolActionType anActionId = (View_ToolActionType)theActionId; - return myActionsMap.contains(anActionId) ? myActionsMap[anActionId]->isChecked() : false; -} - -// ======================================================================= -// function : SaveState -// purpose : -// ======================================================================= -void View_ToolBar::SaveState(View_ToolBar* theToolBar, - QMap& theItems, - const QString& thePrefix) -{ - theItems[thePrefix + "context_type"] = QString::number(theToolBar->CurrentContextType()); -} - -// ======================================================================= -// function : RestoreState -// purpose : -// ======================================================================= -bool View_ToolBar::RestoreState(View_ToolBar* theToolBar, - const QString& theKey, - const QString& theValue, - const QString& thePrefix) -{ - if (theKey == thePrefix + "context_type") - { - theToolBar->SetDefaultContextType((View_ContextType)theValue.toInt()); - } - else - return false; - - return true; -} - -// ======================================================================= -// function : onActionClicked -// purpose : -// ======================================================================= -void View_ToolBar::onActionClicked() -{ - int anId = -1; - QToolButton* aSenderBtn = (QToolButton*)sender(); - - for (QMap::ConstIterator anActionsIt = myActionsMap.begin(), - anActionsLast = myActionsMap.end(); - anActionsIt != anActionsLast; - anActionsIt++) - { - if (anActionsIt.value() == aSenderBtn) - { - anId = anActionsIt.key(); - break; - } - } - if (anId != -1) - emit actionClicked(anId); - - if (anId == View_ToolActionType_KeepViewId || anId == View_ToolActionType_KeepViewOffId) - { - if (anId == View_ToolActionType_KeepViewId) - myActionsMap[View_ToolActionType_KeepViewOffId]->setChecked(!aSenderBtn->isChecked()); - else - myActionsMap[View_ToolActionType_KeepViewId]->setChecked(!aSenderBtn->isChecked()); - } -} diff --git a/tools/View/View_ToolBar.hxx b/tools/View/View_ToolBar.hxx deleted file mode 100644 index 0deb13bfef..0000000000 --- a/tools/View/View_ToolBar.hxx +++ /dev/null @@ -1,122 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_ToolBar_H -#define View_ToolBar_H - -#include -#include -#include -#include - -#include -#include -#include -#include - -class QComboBox; -class QToolButton; -class QWidget; - -//! \class View_ToolBar -//! \brief This is a container of the next view actions: -//! - selection of interactive context -//! - actions of View_ToolActionType enumeration -//! -//! It contains container of possible interactive contexts where the presentations may be visualized -//! and choice control to select an active context. -//! If action is clicked, a signal about is sent. -class View_ToolBar : public QObject -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT View_ToolBar(QWidget* theParent, const bool isUseKeepView = true); - - //! Destructor - virtual ~View_ToolBar() {} - - //! \returns parent widget of actions - QWidget* GetControl() const { return myMainWindow; } - - //! Appends context for the given type - //! \param theType a context type - //! \param theContext a context - Standard_EXPORT void SetContext(View_ContextType theType, - const Handle(AIS_InteractiveContext)& theContext); - - //! \returns type of active item of context selector - Standard_EXPORT View_ContextType CurrentContextType() const; - - //! Sets current context type - //! \param theType a context type - Standard_EXPORT void SetCurrentContextType(View_ContextType theType); - - //! Sets default context type - //! \param theType a context type - void SetDefaultContextType(const View_ContextType theType) - { - myDefaultContextType = (int)theType; - } - - //! \returns an active context of context selector - Standard_EXPORT Handle(AIS_InteractiveContext) CurrentContext() const; - - //! \returns whether the action is checked(toggled). Acceptable only if the action is checkable. - Standard_EXPORT bool IsActionChecked(const int theActionId) const; - - //! Saves state of tool bar actions - //! \param theToolBar a view instance - //! \param[out] theItems properties - //! \param thePrefix preference item prefix - Standard_EXPORT static void SaveState(View_ToolBar* theToolBar, - QMap& theItems, - const QString& thePrefix = QString()); - //! Restores state of tool bar actions - //! \param theToolBar a view instance - //! \param theKey property key - //! \param theValue property value - //! \param thePrefix preference item prefix - //! \return boolean value whether the property is applied to the tree view - Standard_EXPORT static bool RestoreState(View_ToolBar* theToolBar, - const QString& theKey, - const QString& theValue, - const QString& thePrefix = QString()); - -signals: - - //! Signal about click on action of View_ToolActionType enumeration - void actionClicked(int theActionId); - - //! Signal about selection of context - void contextChanged(); - -private slots: - - //! Processes clicked action and emit signal with action identifier - void onActionClicked(); - -private: - QWidget* myMainWindow; //!< tool bar parent widget - QComboBox* myViewSelector; //!< container of possible contexts - int myDefaultContextType; //!< type of context read from preferences - - QMap myActionsMap; //!< tool actions - QMap myViewContexts; //!< contexts - QMap myViewContextNames; //!< names of contexts -}; - -#endif diff --git a/tools/View/View_ToolButton.hxx b/tools/View/View_ToolButton.hxx deleted file mode 100644 index 5c8cf27a9e..0000000000 --- a/tools/View/View_ToolButton.hxx +++ /dev/null @@ -1,73 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_ToolButton_H -#define View_ToolButton_H - -#include -#include -#include -#include -#include - -//! \class View_ToolButton -//! \brief It is a Qt control that implements change checked state for button by double click event -//! Button becomes checked by double click mouse pressed and unchecked by the next press mouse -class View_ToolButton : public QToolButton -{ - Q_OBJECT - -public: - View_ToolButton(QWidget* theParent) - : QToolButton(theParent) - { - } - - ~View_ToolButton() {} - - //! Sets the button checkable, set whether the button checkable or not - //! \param theChecked boolean value - void SetButtonChecked(const bool theChecked) - { - setCheckable(theChecked); - setChecked(theChecked); - emit checkedStateChanged(theChecked); - } - -signals: - //! Sends a signal about checked state is changed - //! \param theState the checked state - void checkedStateChanged(bool theState); - -protected: - //! Sets the button unchecked if it was checked - virtual void mousePressEvent(QMouseEvent* theEvent) - { - if (isChecked()) - SetButtonChecked(false); - else - QToolButton::mousePressEvent(theEvent); - } - - //! Sets the button checked if it was unchecked - virtual void mouseDoubleClickEvent(QMouseEvent* theEvent) - { - QToolButton::mouseDoubleClickEvent(theEvent); - if (!isChecked()) - SetButtonChecked(true); - } -}; - -#endif diff --git a/tools/View/View_ViewActionType.hxx b/tools/View/View_ViewActionType.hxx deleted file mode 100644 index c5571a842c..0000000000 --- a/tools/View/View_ViewActionType.hxx +++ /dev/null @@ -1,27 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_ViewActionType_H -#define View_ViewActionType_H - -//! Actions of view widget -enum View_ViewActionType -{ - View_ViewActionType_FitAllId, //!< fits the view to wrap the bounding box of displayed objects - View_ViewActionType_DisplayModeId //!< change display mode of visualized presentations (to - //!< wireframe or shading) -}; - -#endif diff --git a/tools/View/View_Viewer.cxx b/tools/View/View_Viewer.cxx deleted file mode 100644 index 09250d90b6..0000000000 --- a/tools/View/View_Viewer.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -// ======================================================================= -// function : CreateView -// purpose : -// ======================================================================= -void View_Viewer::CreateView() -{ - if (myView.IsNull()) - myView = myContext->CurrentViewer()->CreateView(); -} - -// ======================================================================= -// function : CreateView -// purpose : -// ======================================================================= -void View_Viewer::SetWindow(const Handle(Aspect_Window)& theWindow) -{ - myView->SetWindow(theWindow); - if (!theWindow->IsMapped()) - theWindow->Map(); -} - -// ======================================================================= -// function : InitViewer -// purpose : -// ======================================================================= -void View_Viewer::InitViewer(const Handle(AIS_InteractiveContext)& theContext) -{ - myContext = theContext; - myViewer = myContext->CurrentViewer(); -} - -// ======================================================================= -// function : CreateStandardViewer -// purpose : -// ======================================================================= -Handle(AIS_InteractiveContext) View_Viewer::CreateStandardViewer() -{ - Handle(Aspect_DisplayConnection) aDisplayConnection = new Aspect_DisplayConnection(); - static Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection); - - Handle(V3d_Viewer) aViewer = new V3d_Viewer(aGraphicDriver); - aViewer->SetDefaultLights(); - aViewer->SetLightOn(); - aViewer->SetDefaultBackgroundColor(Quantity_NOC_GRAY30); - - Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext(aViewer); - aContext->UpdateCurrentViewer(); - - return aContext; -} diff --git a/tools/View/View_Viewer.hxx b/tools/View/View_Viewer.hxx deleted file mode 100644 index a894791c92..0000000000 --- a/tools/View/View_Viewer.hxx +++ /dev/null @@ -1,81 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_Viewer_H -#define View_Viewer_H - -#include -#include -#include -#include -#include -#include - -//! \class View_Viewer -//! \brief It is responsible for context/viewer/view creation and accepting access to: -class View_Viewer -{ -public: - //! Constructor - View_Viewer(const Quantity_Color& theColor) - : myDefaultColor(theColor) - { - } - - //! Destructor - virtual ~View_Viewer() {} - - //! Returns the view default colors - static Quantity_Color DefaultColor() { return Quantity_Color(Quantity_NOC_BLACK); } - - //! Returns the view default colors - static Quantity_Color DisabledColor() - { - return Quantity_Color(195 / 255., 195 / 255., 195 / 255., Quantity_TOC_sRGB); - } - - //! Creates V3d view - Standard_EXPORT void CreateView(); - - //! Fills V3d view by the given window - //! \param depending on platform it is either WNT_Window or Xw_Window - Standard_EXPORT void SetWindow(const Handle(Aspect_Window)& theWindow); - - //! Creates OCC components on the window - //! \param theWindowHandle an id of the application window - Standard_EXPORT void InitViewer(const Handle(AIS_InteractiveContext)& theContext); - - //! Creates OCC components on the window - //! \param theWindowHandle an id of the application window - Standard_EXPORT static Handle(AIS_InteractiveContext) CreateStandardViewer(); - - //! Returns an OCC viewer - const Handle(V3d_Viewer)& GetViewer() { return myViewer; } - - //! Returns active view - const Handle(V3d_View)& GetView() { return myView; } - - //! Returns OCCT context to provide display and selection mechanism - const Handle(AIS_InteractiveContext)& GetContext() const { return myContext; } - -private: - Handle(V3d_Viewer) myViewer; //!< the OCCT viewer - Handle(V3d_View) myView; //!< the OCCT view window - Handle(AIS_InteractiveContext) - myContext; //!< OCCT context to provide display and selection mechanism - Quantity_Color myDefaultColor; //!< the default color of the viewer -}; - -#endif // View_Viewer_H diff --git a/tools/View/View_Widget.cxx b/tools/View/View_Widget.cxx deleted file mode 100644 index cb70d27dcf..0000000000 --- a/tools/View/View_Widget.cxx +++ /dev/null @@ -1,402 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#if !defined _WIN32 - #define QT_CLEAN_NAMESPACE /* avoid definition of INT32 and INT8 */ -#endif - -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#ifdef _WIN32 - #include -#elif defined(HAVE_XLIB) - #include -#elif defined(__APPLE__) - #include -#else - -#endif - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -View_Widget::View_Widget(QWidget* theParent, - const Handle(AIS_InteractiveContext)& theContext, - const bool isFitAllActive) - : QWidget(theParent), - myFirst(true), - myDefaultWidth(-1), - myDefaultHeight(-1), - myViewIsEnabled(true), - myHasInitProj(Standard_False), - myInitVx(0), - myInitVy(0), - myInitVz(0) -{ - myViewer = new View_Viewer(View_Viewer::DefaultColor()); - if (!theContext.IsNull()) - { - myViewer->InitViewer(theContext); - } - else - { - myViewer->InitViewer(myViewer->CreateStandardViewer()); - } - myController = new AIS_ViewController(); - - setAttribute(Qt::WA_PaintOnScreen); - setAttribute(Qt::WA_NoSystemBackground); - - setMouseTracking(true); - setBackgroundRole(QPalette::NoRole); - // set focus policy to threat QContextMenuEvent from keyboard - setFocusPolicy(Qt::StrongFocus); - - initViewActions(); - ((View_ToolButton*)myFitAllAction)->SetButtonChecked(isFitAllActive); -} - -// ======================================================================= -// function : SetPredefinedSize -// purpose : -// ======================================================================= -void View_Widget::SetPredefinedSize(int theDefaultWidth, int theDefaultHeight) -{ - myDefaultWidth = theDefaultWidth; - myDefaultHeight = theDefaultHeight; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void View_Widget::Init() -{ - myViewer->CreateView(); - -#ifdef _WIN32 - Aspect_Handle aWindowHandle = (Aspect_Handle)winId(); - Handle(Aspect_Window) aWnd = new WNT_Window(aWindowHandle); -#elif defined(HAVE_XLIB) - Aspect_Drawable aWindowHandle = (Aspect_Drawable)winId(); - Handle(Aspect_DisplayConnection) aDispConnection = - myViewer->GetContext()->CurrentViewer()->Driver()->GetDisplayConnection(); - Handle(Aspect_Window) aWnd = new Xw_Window(aDispConnection, aWindowHandle); -#elif defined(__APPLE__) - NSView* aViewHandle = (NSView*)winId(); - Handle(Aspect_Window) aWnd = new Cocoa_Window(aViewHandle); -#else - // -#endif - myViewer->SetWindow(aWnd); - - myViewer->GetView()->SetBackgroundColor(View_Viewer::DefaultColor()); - myViewer->GetView()->MustBeResized(); - - if (myHasInitProj) - myViewer->GetView()->SetProj(myInitVx, myInitVy, myInitVz); -} - -// ======================================================================= -// function : DisplayMode -// purpose : -// ======================================================================= -int View_Widget::DisplayMode() const -{ - return myViewActions[View_ViewActionType_DisplayModeId]->isChecked() ? AIS_Shaded : AIS_WireFrame; -} - -// ======================================================================= -// function : SetDisplayMode -// purpose : -// ======================================================================= -void View_Widget::SetDisplayMode(const int theMode) -{ - myViewActions[View_ViewActionType_DisplayModeId]->setChecked(theMode ? AIS_Shaded - : AIS_WireFrame); -} - -// ======================================================================= -// function : paintEvent -// purpose : -// ======================================================================= -void View_Widget::paintEvent(QPaintEvent* /*theEvent*/) -{ -#if (QT_VERSION < 0x050000 || QT_VERSION >= 0x050700) - if (myFirst) - { - Init(); - myFirst = false; - } -#endif - - if (myViewer->GetView()) - myViewer->GetView()->Redraw(); -} - -// ======================================================================= -// function : resizeEvent -// purpose : -// ======================================================================= -void View_Widget::resizeEvent(QResizeEvent* /*theEvent*/) -{ -#if (QT_VERSION > 0x050000 && QT_VERSION < 0x050700) - if (myFirst) - { - Init(); - myFirst = false; - } -#endif - if (myViewer->GetView()) - myViewer->GetView()->MustBeResized(); -} - -// ======================================================================= -// function : sizeHint -// purpose : -// ======================================================================= -QSize View_Widget::sizeHint() const -{ - if (myDefaultWidth > 0 && myDefaultHeight > 0) - return QSize(myDefaultWidth, myDefaultHeight); - - return QWidget::sizeHint(); -} - -// ======================================================================= -// function : SetEnabledView -// purpose : -// ======================================================================= -void View_Widget::SetEnabledView(const bool theIsEnabled) -{ - myViewIsEnabled = theIsEnabled; - - if (myViewer->GetView()) - myViewer->GetView()->SetBackgroundColor(theIsEnabled ? View_Viewer::DefaultColor() - : View_Viewer::DisabledColor()); - ViewAction(View_ViewActionType_DisplayModeId)->setEnabled(theIsEnabled); -} - -// ======================================================================= -// function : SaveState -// purpose : -// ======================================================================= -void View_Widget::SaveState(View_Widget* theWidget, - QMap& theItems, - const QString& thePrefix) -{ - theItems[thePrefix + "fitall"] = theWidget->ViewAction(View_ViewActionType_FitAllId)->isChecked(); - theItems[thePrefix + "dispmode"] = QString::number(theWidget->DisplayMode()); -} - -// ======================================================================= -// function : RestoreState -// purpose : -// ======================================================================= -bool View_Widget::RestoreState(View_Widget* theWidget, - const QString& theKey, - const QString& theValue, - const QString& thePrefix) -{ - if (theKey == thePrefix + "fitall") - { - theWidget->SetActionChecked(View_ViewActionType_FitAllId, theValue.toInt() > 0); - } - else if (theKey == thePrefix + "dispmode") - { - theWidget->SetDisplayMode(theValue.toInt()); - } - else - return false; - - return true; -} - -// ======================================================================= -// function : onCheckedStateChanged -// purpose : -// ======================================================================= -void View_Widget::onCheckedStateChanged(bool isOn) -{ - QWidget* aSentByAction = (QWidget*)sender(); - - if (aSentByAction == myFitAllAction) - emit checkedStateChanged(View_ViewActionType_FitAllId, isOn); -} - -// ======================================================================= -// function : initViewActions -// purpose : -// ======================================================================= -void View_Widget::initViewActions() -{ - if (!myViewActions.empty()) - return; - - myFitAllAction = new View_ToolButton(this); // action for automatic fit all - connect(myFitAllAction, - SIGNAL(checkedStateChanged(bool)), - this, - SLOT(onCheckedStateChanged(bool))); - createAction(View_ViewActionType_FitAllId, - ":/icons/view_fitall.png", - tr("Fit All"), - SLOT(OnFitAll())); - myFitAllAction->setDefaultAction(ViewAction(View_ViewActionType_FitAllId)); - - createAction(View_ViewActionType_DisplayModeId, - ":/icons/view_dm_shading.png", - tr("Display Mode"), - SIGNAL(displayModeClicked()), - true); -} - -// ======================================================================= -// function : mousePressEvent -// purpose : -// ======================================================================= -void View_Widget::mousePressEvent(QMouseEvent* theEvent) -{ - if (myController->PressMouseButton(Graphic3d_Vec2i(theEvent->x(), theEvent->y()), - keyMouse(theEvent->button()), - keyFlag(theEvent->modifiers()), - Standard_False)) - { - myController->FlushViewEvents(myViewer->GetContext(), myViewer->GetView(), Standard_True); - } -} - -// ======================================================================= -// function : mouseReleaseEvent -// purpose : -// ======================================================================= -void View_Widget::mouseReleaseEvent(QMouseEvent* theEvent) -{ - if (myController->ReleaseMouseButton(Graphic3d_Vec2i(theEvent->x(), theEvent->y()), - keyMouse(theEvent->button()), - keyFlag(theEvent->modifiers()), - Standard_False)) - { - myController->FlushViewEvents(myViewer->GetContext(), myViewer->GetView(), Standard_True); - } -} - -// ======================================================================= -// function : mouseMoveEvent -// purpose : -// ======================================================================= -void View_Widget::mouseMoveEvent(QMouseEvent* theEvent) -{ - if (myViewer->GetView().IsNull()) - { - return; - } - - myController->UpdateMousePosition(Graphic3d_Vec2i(theEvent->x(), theEvent->y()), - keyMouse(theEvent->button()), - keyFlag(theEvent->modifiers()), - Standard_False); - - myController->FlushViewEvents(myViewer->GetContext(), myViewer->GetView(), Standard_True); -} - -// ======================================================================= -// function : createAction -// purpose : -// ======================================================================= -void View_Widget::createAction(const View_ViewActionType theActionId, - const QString& theIcon, - const QString& theText, - const char* theSlot, - const bool isCheckable, - const QString& theToolBar, - const QString& theStatusBar) -{ - QAction* anAction = new QAction(QIcon(theIcon), theText, this); - anAction->setToolTip(!theToolBar.isEmpty() ? theToolBar : theText); - anAction->setStatusTip(!theStatusBar.isEmpty() ? theStatusBar : theText); - if (isCheckable) - anAction->setCheckable(true); - connect(anAction, SIGNAL(triggered()), this, theSlot); - myViewActions[theActionId] = anAction; -} - -// ======================================================================= -// function : keyFlag -// purpose : -// ======================================================================= -Aspect_VKeyFlags View_Widget::keyFlag(const int theModifierId) -{ - switch (theModifierId) - { - case Qt::NoModifier: - return Aspect_VKeyFlags_NONE; - case Qt::ShiftModifier: - return Aspect_VKeyFlags_SHIFT; - case Qt::ControlModifier: - return Aspect_VKeyFlags_CTRL; - default: - break; - } - return Aspect_VKeyFlags_NONE; -} - -// ======================================================================= -// function : keyMouse -// purpose : -// ======================================================================= -Aspect_VKeyMouse View_Widget::keyMouse(const int theButtonId) -{ - switch (theButtonId) - { - case Qt::NoButton: - return Aspect_VKeyMouse_NONE; - case Qt::LeftButton: - return Aspect_VKeyMouse_LeftButton; - case Qt::RightButton: - return Aspect_VKeyMouse_RightButton; - case Qt::MidButton: - return Aspect_VKeyMouse_MiddleButton; - default: - break; - } - return Aspect_VKeyMouse_NONE; -} diff --git a/tools/View/View_Widget.hxx b/tools/View/View_Widget.hxx deleted file mode 100644 index 9eefc034f2..0000000000 --- a/tools/View/View_Widget.hxx +++ /dev/null @@ -1,240 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_View_H -#define View_View_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -class View_Viewer; - -//! \class View_Widget -//! \brief It is a Qt control that visualizes content of OCCT 3D view -//! It creates control and actions of manipulating of this view, -//! emits signal about selection happening in the view and signal about display mode change and -//! changes application cursor depending on an active action. -class View_Widget : public QWidget -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT View_Widget(QWidget* theParent, - const Handle(AIS_InteractiveContext)& theContext, - const bool isFitAllActive); - - //! Destructor - virtual ~View_Widget() {} - - //! Returns current viewer - View_Viewer* GetViewer() const { return myViewer; } - - //! Sets default size that is used in sizeHint when the widget is firstly show - Standard_EXPORT void SetPredefinedSize(int theDefaultWidth, int theDefaultHeight); - - //! Creates V3d view and set Qt control for it - Standard_EXPORT void Init(); - - //! Returns an action for the given action type - //! \param theActionId an action index - QAction* ViewAction(const View_ViewActionType theActionId) const - { - return myViewActions[theActionId]; - }; - - //! Returns an action widget if exist. Implemented for fit all widget. - //! \param theActionId an action index - QWidget* GetWidget(const View_ViewActionType theActionId) const - { - return theActionId == View_ViewActionType_FitAllId ? myFitAllAction : 0; - }; - - //! \returns 0 - AIS_WireFrame, 1 - AIS_Shaded - Standard_EXPORT int DisplayMode() const; - - //! Sets display mode: 0 - AIS_WireFrame, 1 - AIS_Shaded - Standard_EXPORT void SetDisplayMode(const int theMode); - - //! Sets enable/disable view and tool bar actions depending on the parameter - //! \param theIsEnabled boolean value - Standard_EXPORT void SetEnabledView(const bool theIsEnabled); - - //! Returns true if action is checked. It processes fit all action only. - //! \param theIsEnabled boolean value - bool IsActionChecked(const View_ViewActionType theActionId) - { - return theActionId == View_ViewActionType_FitAllId && myFitAllAction->isChecked(); - } - - //! Sets checked fit all action. Double click on fit all action set the action checked - //! automatically \param theIsEnabled boolean value - void SetActionChecked(const View_ViewActionType theActionId, const bool isChecked) - { - if (theActionId == View_ViewActionType_FitAllId) - myFitAllAction->setChecked(isChecked); - } - - //! Sets initial camera position - //! \param theVx direction on Ox - //! \param theVy direction on Oy - //! \param theVz direction on Oz - void SetInitProj(const Standard_Real theVx, const Standard_Real theVy, const Standard_Real theVz) - { - myHasInitProj = Standard_True; - myInitVx = theVx; - myInitVy = theVy; - myInitVz = theVz; - } - - //! Returns paint engine for the OpenGL viewer. Avoid default execution of Qt Widget. - virtual QPaintEngine* paintEngine() const Standard_OVERRIDE { return 0; } - - //! Return the recommended size for view. If default size exists, it returns the default size - Standard_EXPORT virtual QSize sizeHint() const Standard_OVERRIDE; - - //! Saves state of widget actions - //! \param theParameters a view instance - //! \param[out] theItems properties - //! \param thePrefix preference item prefix - Standard_EXPORT static void SaveState(View_Widget* theWidget, - QMap& theItems, - const QString& thePrefix = QString()); - - //! Restores state of widget actions - //! \param theParameters a view instance - //! \param theKey property key - //! \param theValue property value - //! \param thePrefix preference item prefix - //! \return boolean value whether the property is applied to the tree view - Standard_EXPORT static bool RestoreState(View_Widget* theWidget, - const QString& theKey, - const QString& theValue, - const QString& thePrefix = QString()); - -signals: - - //! Sends a signal about selection change if the left mouse button is pressed and current action - //! does not process it - void selectionChanged(); - - //! Sends a signal about display mode change - void displayModeClicked(); - - //! Sends a signal about checked state is changed - //! \param theActionId an action index - //! \param theState the checked state - void checkedStateChanged(const int theActionId, bool theState); - -public slots: - - //! Fits all the V3d view and redraw view - void OnFitAll() { myViewer->GetView()->FitAll(); } - - //! Updates states of widget actions - //! - //! - if the state is checked, uncheck all other actions - Standard_EXPORT void onCheckedStateChanged(bool isOn); - -protected: - //! Avoids Qt standard execution of this method, redraw V3d view - //! \param an event - virtual void paintEvent(QPaintEvent* theEvent) Standard_OVERRIDE; - - //! Avoids Qt standard execution of this method, do mustBeResized for V3d view, Init view if it is - //! the first call \param an event - virtual void resizeEvent(QResizeEvent* theEvent) Standard_OVERRIDE; - - //! Left, Middle, Right button processing - //! \param an event - virtual void mousePressEvent(QMouseEvent* theEvent) Standard_OVERRIDE; - - //! Left, Middle, Right button processing - //! \param an event - virtual void mouseReleaseEvent(QMouseEvent* theEvent) Standard_OVERRIDE; - - //! Left, Middle, Right button processing - //! \param an event - virtual void mouseMoveEvent(QMouseEvent* theEvent) Standard_OVERRIDE; - -protected: - //! Creates view actions and fills an internal map - void initViewActions(); - - //! Empty: template to create popup menu - //! \param theX a horizontal position of mouse event - //! \param theX a vertical position of mouse event - void popup(const Standard_Integer theX, const Standard_Integer theY) - { - (void)theX; - (void)theY; - } - -private: - //! Creates action and stores it in a map of actions - //! \param theActionId an identifier of action in internal map - //! \param theIcon an icon name and place according to qrc resource file, e.g. - //! ":/icons/view_fitall.png" \param theText an action text \param theToolBar a tool bar action - //! text \param theStatusBar a status bar action text - void createAction(const View_ViewActionType theActionId, - const QString& theIcon, - const QString& theText, - const char* theSlot, - const bool isCheckable = false, - const QString& theToolBar = QString(), - const QString& theStatusBar = QString()); - -private: - //! Converts Qt modifier key to Aspect key flag - //! \param theModifierId the event modifier - static Aspect_VKeyFlags keyFlag(const int theModifierId); - - //! Converts Qt button key to Aspect key mouse - //! \param theButtonId the event button - static Aspect_VKeyMouse keyMouse(const int theButtonId); - -private: - View_Viewer* myViewer; //!< connector to context, V3d viewer and V3d View - AIS_ViewController* myController; //!< controller to process view actions - - QToolButton* - myFitAllAction; //!< widget for fit all, processed double click to perform action automatically - QMap myViewActions; //!< tool bar view actions - - Standard_Boolean myFirst; //!< flag to Init view by the first resize/paint call - Standard_Integer myDefaultWidth; //!< default width for the first sizeHint - Standard_Integer myDefaultHeight; //!< default height for the first sizeHint - Standard_Boolean - myViewIsEnabled; //!< flag if the view and tool bar view actions are enabled/disabled - - Standard_Boolean myHasInitProj; //!< is initial camera position defined - Standard_Real myInitVx; //!< initial camera position on X - Standard_Real myInitVy; //!< initial camera position on Y - Standard_Real myInitVz; //!< initial camera position on Z -}; - -#endif diff --git a/tools/View/View_Window.cxx b/tools/View/View_Window.cxx deleted file mode 100644 index 0171b30cc2..0000000000 --- a/tools/View/View_Window.cxx +++ /dev/null @@ -1,335 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#if !defined _WIN32 - #define QT_CLEAN_NAMESPACE /* avoid definition of INT32 and INT8 */ -#endif - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -const int DEFAULT_SPACING = 3; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -View_Window::View_Window(QWidget* theParent, - const Handle(AIS_InteractiveContext)& theContext, - const bool isUseKeepView, - const bool isFitAllActive) - : QWidget(theParent) -{ - QGridLayout* aViewLayout = new QGridLayout(this); - aViewLayout->setContentsMargins(0, 0, 0, 0); - aViewLayout->setSpacing(DEFAULT_SPACING); - - myView = new View_Widget(this, theContext, isFitAllActive); - myViewToolBar = new View_ToolBar(this, isUseKeepView); - aViewLayout->addWidget(myViewToolBar->GetControl(), 0, 0, 1, 2); - connect(myViewToolBar, SIGNAL(contextChanged()), this, SLOT(onViewSelectorActivated())); - connect(myViewToolBar, SIGNAL(actionClicked(int)), this, SLOT(onToolBarActionClicked(int))); - - connect(myView, - SIGNAL(checkedStateChanged(int, bool)), - this, - SLOT(onCheckedStateChanged(int, bool))); - - myView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(myView, - SIGNAL(customContextMenuRequested(const QPoint&)), - this, - SLOT(onViewContextMenuRequested(const QPoint&))); - - myActionsToolBar = new QToolBar(this); - myActionsToolBar->layout()->setContentsMargins(0, 0, 0, 0); - myActionsToolBar->setOrientation(Qt::Vertical); - - myActionsToolBar->addWidget(myView->GetWidget(View_ViewActionType_FitAllId)); - myActionsToolBar->addAction(myView->ViewAction(View_ViewActionType_DisplayModeId)); - - aViewLayout->addWidget(myActionsToolBar, 1, 0); - aViewLayout->addWidget(myView, 1, 1); - aViewLayout->setRowStretch(1, 1); - - Handle(AIS_InteractiveContext) aContext = myView->GetViewer()->GetContext(); - myViewToolBar->SetContext(View_ContextType_Own, aContext); - - myDisplayer = new View_Displayer(); - if (!isUseKeepView) - myDisplayer->KeepPresentations(true); - myDisplayer->SetFitAllActive(isFitAllActive); - connect(myView, SIGNAL(displayModeClicked()), this, SLOT(onDisplayModeChanged())); - onViewSelectorActivated(); -} - -// ======================================================================= -// function : SetContext -// purpose : -// ======================================================================= -void View_Window::SetContext(View_ContextType /*theType*/, - const Handle(AIS_InteractiveContext)& theContext) -{ - ViewToolBar()->SetContext(View_ContextType_External, theContext); -} - -// ======================================================================= -// function : SetPredefinedSize -// purpose : -// ======================================================================= -void View_Window::SetPredefinedSize(int theDefaultWidth, int theDefaultHeight) -{ - myView->SetPredefinedSize(theDefaultWidth, theDefaultHeight); -} - -// ======================================================================= -// function : SetInitProj -// purpose : -// ======================================================================= -void View_Window::SetInitProj(const Standard_Real theVx, - const Standard_Real theVy, - const Standard_Real theVz) -{ - myView->SetInitProj(theVx, theVy, theVz); -} - -// ======================================================================= -// function : View -// purpose : -// ======================================================================= -Handle(V3d_View) View_Window::View() const -{ - return myView->GetViewer()->GetView(); -} - -// ======================================================================= -// function : SaveState -// purpose : -// ======================================================================= -void View_Window::SaveState(View_Window* theView, - QMap& theItems, - const QString& thePrefix) -{ - QStringList aCameraDirection; - Standard_Real aVX, aVY, aVZ; - Handle(V3d_View) aView = theView->View(); - if (aView.IsNull()) - return; - - aView->Proj(aVX, aVY, aVZ); - aCameraDirection << QString::number(aVX) << QString::number(aVY) << QString::number(aVZ); - - theItems[thePrefix + "view_camera_direction"] = aCameraDirection.join(","); - - View_PreviewParameters::SaveState(theView->Displayer()->DisplayPreview()->GetPreviewParameters(), - theItems, - "preview_parameters_"); - View_ToolBar::SaveState(theView->ViewToolBar(), theItems, "view_toolbar_"); - View_Widget::SaveState(theView->ViewWidget(), theItems, "view_widget_"); -} - -// ======================================================================= -// function : RestoreState -// purpose : -// ======================================================================= -bool View_Window::RestoreState(View_Window* theView, - const QString& theKey, - const QString& theValue, - const QString& thePrefix) -{ - if (theKey == thePrefix + "view_camera_direction") - { - QStringList aValues = theValue.split(","); - if (aValues.size() == 3) - { - Standard_Real aVX = aValues.at(0).toDouble(); - Standard_Real aVY = aValues.at(1).toDouble(); - Standard_Real aVZ = aValues.at(2).toDouble(); - - theView->SetInitProj(aVX, aVY, aVZ); - } - return true; - } - else if (View_PreviewParameters::RestoreState( - theView->Displayer()->DisplayPreview()->GetPreviewParameters(), - theKey, - theValue, - "preview_parameters_")) - { - return true; - } - else if (View_ToolBar::RestoreState(theView->ViewToolBar(), theKey, theValue, "view_toolbar_")) - { - return true; - } - else if (View_Widget::RestoreState(theView->ViewWidget(), theKey, theValue, "view_widget_")) - { - // display mode is restored - View_Displayer* aDisplayer = theView->Displayer(); - if (theView->ViewWidget()->DisplayMode() != aDisplayer->DisplayMode()) - aDisplayer->SetDisplayMode(theView->ViewWidget()->DisplayMode()); - - bool toFitAll = theView->ViewWidget()->IsActionChecked(View_ViewActionType_FitAllId); - if (toFitAll != aDisplayer->IsFitAllActive()) - aDisplayer->SetFitAllActive(toFitAll); - - return true; - } - - return false; -} - -// ======================================================================= -// function : onViewSelectorActivated -// purpose : -// ======================================================================= -void View_Window::onViewSelectorActivated() -{ - View_ContextType aType = myViewToolBar->CurrentContextType(); - bool isViewEnabled = aType == View_ContextType_Own; - - myView->SetEnabledView(isViewEnabled); - - Handle(AIS_InteractiveContext) aContext = myViewToolBar->CurrentContext(); - myDisplayer->EraseAllPresentations(true); - emit eraseAllPerformed(); - - myDisplayer->SetContext(aContext); -} - -// ======================================================================= -// function : onToolBarActionClicked -// purpose : -// ======================================================================= -void View_Window::onToolBarActionClicked(const int theActionId) -{ - switch (theActionId) - { - case View_ToolActionType_Trihedron: { - myDisplayer->DisplayDefaultTrihedron(myViewToolBar->IsActionChecked(theActionId), - Standard_True); - break; - } - case View_ToolActionType_ViewCube: { - myDisplayer->DisplayViewCube(myViewToolBar->IsActionChecked(theActionId), Standard_True); - break; - } - - case View_ToolActionType_KeepViewId: { - myDisplayer->KeepPresentations(myViewToolBar->IsActionChecked(theActionId)); - break; - } - case View_ToolActionType_KeepViewOffId: { - myDisplayer->KeepPresentations(!myViewToolBar->IsActionChecked(theActionId)); - break; - } - case View_ToolActionType_ClearViewId: { - myDisplayer->EraseAllPresentations(true); - emit eraseAllPerformed(); - break; - } - default: - break; - } -} - -// ======================================================================= -// function : onCheckedStateChanged -// purpose : -// ======================================================================= -void View_Window::onCheckedStateChanged(int theActionId, bool theState) -{ - if (theActionId == View_ViewActionType_FitAllId) - myDisplayer->SetFitAllActive(theState); -} - -// ======================================================================= -// function : onViewContextMenuRequested -// purpose : -// ======================================================================= -void View_Window::onViewContextMenuRequested(const QPoint& thePosition) -{ - QMenu* aMenu = new QMenu(this); - QMenu* anOrientationSubMenu = aMenu->addMenu("Set View Orientation"); - - for (int i = 0; i < (int)V3d_XnegYnegZneg; i++) - { - V3d_TypeOfOrientation anOrientationType = (V3d_TypeOfOrientation)i; - - QAction* anAction = new QAction(V3d::TypeOfOrientationToString(anOrientationType), this); - QObject::connect(anAction, SIGNAL(triggered(bool)), this, SLOT(onSetOrientation())); - - anOrientationSubMenu->addAction(anAction); - } - aMenu->addMenu(anOrientationSubMenu); - - QPoint aPoint = myView->mapToGlobal(thePosition); - aMenu->exec(aPoint); -} - -// ======================================================================= -// function : onSetOrientation -// purpose : -// ======================================================================= -void View_Window::onSetOrientation() -{ - QAction* anAction = (QAction*)(sender()); - - TCollection_AsciiString anOrientationStr(anAction->text().toStdString().c_str()); - - V3d_TypeOfOrientation anOrientationType; - if (!V3d::TypeOfOrientationFromString(anOrientationStr.ToCString(), anOrientationType)) - return; - - Handle(V3d_View) aView = myView->GetViewer()->GetView(); - if (aView.IsNull()) - return; - - aView->SetProj(anOrientationType); - aView->FitAll(); - aView->Redraw(); -} - -// ======================================================================= -// function : onDisplayModeChanged -// purpose : -// ======================================================================= -void View_Window::onDisplayModeChanged() -{ - int aDisplayMode = myView->DisplayMode(); - for (NCollection_DataMap>::Iterator - anIterator(myDisplayer->GetDisplayed()); - anIterator.More(); - anIterator.Next()) - myDisplayer->SetDisplayMode(aDisplayMode, anIterator.Key(), false); - myDisplayer->UpdateViewer(); -} diff --git a/tools/View/View_Window.hxx b/tools/View/View_Window.hxx deleted file mode 100644 index 91063ff5b9..0000000000 --- a/tools/View/View_Window.hxx +++ /dev/null @@ -1,141 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef View_Window_H -#define View_Window_H - -#include -#include - -#include -#include -#include - -class View_Displayer; -class View_ToolBar; -class View_Widget; - -class QToolBar; - -//! \class View_Window -//! \brief It is a widget where in grid layout View widget and tool bars are placed. There are two -//! tool bars. The first, view actions, tool bar is placed on Vertical, the window tool bar is -//! placed Horizontally. The second tool bar contains actions of View_ToolBar. -class View_Window : public QWidget -{ - Q_OBJECT - -public: - //! Constructor - Standard_EXPORT View_Window( - QWidget* theParent, - const Handle(AIS_InteractiveContext)& theContext = Handle(AIS_InteractiveContext)(), - const bool isUseKeepView = true, - const bool isFitAllActive = true); - - //! Destructor - virtual ~View_Window() {} - - //! Returns view displayer - View_Displayer* Displayer() const { return myDisplayer; } - - //! Returns view widget - View_Widget* ViewWidget() const { return myView; } - - //! Returns actions tool bar - QToolBar* ActionsToolBar() const { return myActionsToolBar; } - - //! Returns window tool bar - View_ToolBar* ViewToolBar() const { return myViewToolBar; } - - //! Sets a new context for context type - //! \param theType a type of context, will be selected in the tool bar combo box - //! \param theContext an AIS context - Standard_EXPORT void SetContext(View_ContextType theType, - const Handle(AIS_InteractiveContext)& theContext); - - //! Sets default size that is used in sizeHint when the widget is firstly show - Standard_EXPORT void SetPredefinedSize(int theDefaultWidth, int theDefaultHeight); - - //! Sets initial camera position - //! \param theVx direction on Ox - //! \param theVy direction on Oy - //! \param theVz direction on Oz - Standard_EXPORT void SetInitProj(const Standard_Real theVx, - const Standard_Real theVy, - const Standard_Real theVz); - - //! Returns an active view - Standard_EXPORT Handle(V3d_View) View() const; - - //! Saves state of view window in a container in form: key, value. It saves: - //! - visibility of columns, - //! - columns width - //! \param theTreeView a view instance - //! \param[out] theItems properties - //! \param thePrefix preference item prefix - Standard_EXPORT static void SaveState(View_Window* theView, - QMap& theItems, - const QString& thePrefix = QString()); - - //! Restores state of view window by a container - //! \param theTreeView a view instance - //! \param theKey property key - //! \param theValue property value - //! \param thePrefix preference item prefix - //! \return boolean value whether the property is applied to the tree view - Standard_EXPORT static bool RestoreState(View_Window* theView, - const QString& theKey, - const QString& theValue, - const QString& thePrefix = QString()); - -signals: - //! Signals about calling erasing all presentations in context - void eraseAllPerformed(); - -protected slots: - - //! Processing context change: - //! - set an active context in the displayer, - //! - erase all displayed presentations from the previous context, - //! - sets the current view enabled only if a current context type is View_ContextType_Own - void onViewSelectorActivated(); - - //! Processing widget action checked state changed: for Fit All action, if checked, displayer do - //! FitAll automatically \param theActionId a clicked action \param theState a result checked - //! state - void onCheckedStateChanged(int theActionId, bool theState); - - //! Processing window tool bar actions - void onToolBarActionClicked(const int theActionId); - - //! Shows context menu for view. It contains set view orientation actions. - //! \param thePosition a clicked point - void onViewContextMenuRequested(const QPoint& thePosition); - - //! Sets the view scene orientation by the text of selected action - void onSetOrientation(); - - //! Sets selected display mode in the current context - void onDisplayModeChanged(); - -private: - View_Displayer* myDisplayer; //!< displayer - View_Widget* myView; //!< view widget - QToolBar* myActionsToolBar; //!< actions tool bar - View_ToolBar* myViewToolBar; //!< window tool bar -}; - -#endif diff --git a/tools/View/icons/keep_view_off.png b/tools/View/icons/keep_view_off.png deleted file mode 100644 index 7a928d32a2b61ecaa53663246736a534c5917991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4ut0NSqyLR_n`epi{+E>a0TP;FIrWKz#D8N$ oV*{fJUH--ff2|x=@=Gv$nlAb8&5R!{KxZ&`y85}Sb4q9e0C9X?mH+?% diff --git a/tools/View/icons/keep_view_on.png b/tools/View/icons/keep_view_on.png deleted file mode 100644 index 9f3c4c71b0e3bbee2fe1730703eb3af8e3810807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmV-L0=oT)P)K3 zqjK(Yu0#Nxpm2MAezvxiL~Heh=Q9AM@`Wo-Hr*d2I}*jotL@~3F7@}LIN1c90PbZq z?15Z3ylm~(b+lbHn3Us*Jm0`@Udy|I)UP-?nKaX&Fup!NTLUP?=Wj^vQn$+?#2E0t z*Vx;wT+i>!9Rt?zsv68;e8H=VR~2KwLkBaL9i|qIO`Q7ykYYuQl`!qRX$=LDuv7Jg zXAipRr!i%}nm51X!){z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;FiAu~RCwBA{Qv(y12q9a05O0Jgkf}$kdQ#KZ2$qp zgirF{zkdv;PoMsO_Uv+^4F(7xoCZcjMEw8w@gqZEU?9-ozaSxbAm$=uAV2`&^D>u- ziOK&nXO{jydUWRhEnC|DLk-0X00Ib~m$_cQe$8;_4l~1#ADW1qB5eL_|aw*x6aZd?0=erEvm)0Aj%>DI_Gsz`?-* zbR`>z`;{020RjlGfvl{o3`|TQPp}c44gmrPZ#raTWP~VU!fvm(w>L)800b`7drzdCp!Z(GYbPq`|sbs7`}Y@&hY2YUj~2x zLUCbYV&Z?8VOzFr0kQ4&?CAl~%Yb+e5Vr$y4H9mTjEwx>-JJnalL1l>5I`s{w6nAO z|MKNah7~KC7>tY}O!n{ZJLBkB)B#O<-=Hy#4!EJ|6C`&XAb?N|1SXOHKY#vY0A@9Y z@83T&xVV%QBN_A%nrzSk$S^G^`x-z1p@*SnO-;=;V`Dak=g;3Vym|A9p{{PeC)BWq zIMN_22Z6wAfB-@_5R_Lz2ADvF9suzfD1JjsIs^zH^aKX-(rGALgix-)1^@yGTe3kf g1c=JRFaQu>05%EfVPBu~R{#J207*qoM6N<$g3D|Y2LJ#7 diff --git a/tools/View/icons/view_clear.png b/tools/View/icons/view_clear.png deleted file mode 100644 index 22578a9ba32821424ad1dfeaf78dd64668831b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DVB6cUq=Rpjs4tz5?O(K&H|6f zVg?4j!ywFfJby(BP*AGGHKHUqKdq!Zu_%=xATcwqM9KLZGTH zPZ!4!3;*6eN4^6JJclc+{2!;!ZAuYoYO|=AV*2sgs;tG||1NzuC+?r`x?feDX9;Cu6-l0@4w?#eqpg`_Z=Jl)c{?^ N;OXk;vd$@?2>`<;V;ukh diff --git a/tools/View/icons/view_cube.png b/tools/View/icons/view_cube.png deleted file mode 100644 index d373c4b238f43a7b76556584dcb8056d7e901b99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@)?VR+?^QK zos)S9l1z8>b!1@J*w6hZkrl}2EbxddW?X?_wfUrhf|4b!5hcO-X(i=}MX3zs z<>h*rdD+Fui3O>8`9^Jz|CTa&+zU+RdK~ z7(JNnt_Ruws{j9!IdvlY12#j$z-Jaa^3t*-UHBSQnFSP1D@anMprBNVYeY$Kep*R+Vo@qXKw@TIiJqTph(ejM zo~fRpfx(xeg+Ntdo-U3d7XEMh4EYWi@GyNY`9G&Cj7RN+anMprBNVYeY$Kep*R+Vo@qXKw@TIiJqTph(ejM zo~fRpfx(xeg+Nseo-U3d7XC{+9fb}k@G$-U?;p*{cCjcs?HX&%F^T;h$#c5i|Bzf! zoxPygn(L`8S6hw)K`+b=eezTbx_oy$p qD{6LOujz%IvZ=z$9?2d1%yet_RreUKn|pz7VeoYIb6Mw<&;$TrE?}zw diff --git a/tools/View/icons/view_fitall.png b/tools/View/icons/view_fitall.png deleted file mode 100644 index 21d2f423ef4acbf4380ff497084e7fb206037100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!7%)r1n>(-?sKn{O^Pl)S*0|y!!82HV0oYtJyeg`d=T#E!A>Kj7jX5<^IG- zWuF9VJ&8BQ4WU+a-=k0smdMUac*xWgB?+c&Q#}%=uzu8aq Wv#}d9=CuH=VDNPHb6Mw<&;$Ud^G!kk diff --git a/tools/ViewControl/FILES b/tools/ViewControl/FILES deleted file mode 100644 index 337fbc5ee3..0000000000 --- a/tools/ViewControl/FILES +++ /dev/null @@ -1,18 +0,0 @@ -ViewControl_ColorSelector.cxx -ViewControl_ColorSelector.hxx -ViewControl_EditType.hxx -ViewControl_MessageDialog.cxx -ViewControl_MessageDialog.hxx -ViewControl_PropertyView.cxx -ViewControl_PropertyView.hxx -ViewControl_Table.cxx -ViewControl_Table.hxx -ViewControl_TableItemDelegate.cxx -ViewControl_TableItemDelegate.hxx -ViewControl_TableModel.cxx -ViewControl_TableModel.hxx -ViewControl_TableModelValues.cxx -ViewControl_TableModelValues.hxx -ViewControl_Tools.cxx -ViewControl_Tools.hxx -ViewControl_TreeView.hxx diff --git a/tools/ViewControl/ViewControl_ColorSelector.cxx b/tools/ViewControl/ViewControl_ColorSelector.cxx deleted file mode 100644 index 7533b007a6..0000000000 --- a/tools/ViewControl/ViewControl_ColorSelector.cxx +++ /dev/null @@ -1,591 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//! Kinds of delegate cell in OCCT Color model to present a custom presentation (rect bounded by a -//! colored frame) -enum ViewControl_ColorDelegateKind -{ - ViewControl_ColorDelegateKind_None, //!< usual item - ViewControl_ColorDelegateKind_Activated, //!< active item - ViewControl_ColorDelegateKind_Highlighted, //!< highlighted item - ViewControl_ColorDelegateKind_Selected //!< selected item -}; - -//! Model for a table of parameters: Current Color, Red, Green, Blue, Alpha, OCCT color name -class ViewControl_ParametersModel : public ViewControl_TableModelValues -{ -public: - ViewControl_ParametersModel(ViewControl_ColorSelector* theSelector) - : ViewControl_TableModelValues(), - mySelector(theSelector) - { - } - - virtual ~ViewControl_ParametersModel() {} - - //! Inits model by the parameter color - //! \param theColor model active color - void SetColor(const Quantity_ColorRGBA& theColor, ViewControl_TableModel* theModel) - { - myColor = theColor; - theModel->EmitLayoutChanged(); - } - - //! Returns current selected color - //! \return color value - Quantity_ColorRGBA GetColor() const { return myColor; } - - //! Returns item information(short) for display role. - //! \param theIndex a model index - //! \param theRole a view role - //! \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant Data(const int theRow, - const int theColumn, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE - { - //(void)theRow; (void)theColumn; (void) theRole; - if (theRole == Qt::BackgroundRole && theColumn == 1 && theRow == 0) - return ViewControl_ColorSelector::ColorToQColor(myColor); - - if (theRole == Qt::ForegroundRole && theColumn == 1 && theRow >= 2 && theRow <= 5) - return ViewControl_TableModelValues::EditCellColor(); - - if (theRole != Qt::DisplayRole) - return QVariant(); - - bool isFirstColumn = theColumn == 0; - switch (theRow) - { - case 0: - return isFirstColumn ? QVariant("Color") : QVariant(); - case 1: { - if (isFirstColumn) - return QVariant("Name"); - Quantity_NameOfColor aColorName; - if (ViewControl_ColorSelector::IsExactColorName(myColor, aColorName)) - return Quantity_Color::StringName(aColorName); - } - break; - case 2: - return isFirstColumn ? QVariant("Red") - : ViewControl_Tools::ToVariant(myColor.GetRGB().Red()); - case 3: - return isFirstColumn ? QVariant("Green") - : ViewControl_Tools::ToVariant(myColor.GetRGB().Green()); - case 4: - return isFirstColumn ? QVariant("Blue") - : ViewControl_Tools::ToVariant(myColor.GetRGB().Blue()); - case 5: - return isFirstColumn ? QVariant("Alpha") : ViewControl_Tools::ToVariant(myColor.Alpha()); - case 6: - return isFirstColumn ? QVariant("Near Name") - : Quantity_Color::StringName(myColor.GetRGB().Name()); - } - return QVariant(); - } - - //! Sets content of the model index for the given role, it is applied to internal container of - //! values \param theRow a model index row \param theColumn a model index column \param theRole a - //! view role \return true if the value is changed - virtual bool SetData(const int theRow, const int theColumn, const QVariant& theValue, int) - Standard_OVERRIDE - { - if (theColumn != 1 || theRow < 2 || theRow > 5) - return false; - - switch (theRow) - { - case 2: - case 3: - case 4: { - myColor.ChangeRGB().SetValues( - theRow == 2 ? ViewControl_Tools::ToShortRealValue(theValue) : myColor.GetRGB().Red(), - theRow == 3 ? ViewControl_Tools::ToShortRealValue(theValue) : myColor.GetRGB().Green(), - theRow == 4 ? ViewControl_Tools::ToShortRealValue(theValue) : myColor.GetRGB().Blue(), - Quantity_TOC_RGB); - } - break; - case 5: - myColor.SetAlpha(ViewControl_Tools::ToShortRealValue(theValue)); - break; - } - mySelector->ParameterColorChanged(); - return true; - } - - //! Returns number of tree level line items = columns in table view - virtual int ColumnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 2; - } - - //! Returns only one row in table view - virtual int RowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 7; - } - - //! Returns editable flag for color RGB and alpha rows - //! \return flags - virtual Qt::ItemFlags Flags(const QModelIndex& theIndex) const Standard_OVERRIDE - { - Qt::ItemFlags aFlags = ViewControl_TableModelValues::Flags(theIndex); - - if (theIndex.column() == 1 && theIndex.row() >= 2 && theIndex.row() <= 5) - aFlags = aFlags | Qt::ItemIsEditable; - - return aFlags; - } - - //! Returns type of edit control for the model index. By default, it is an empty control - //! \param theRow a model index row - //! \param theColumn a model index column - //! \return edit type - virtual ViewControl_EditType GetEditType(const int theRow, const int theColumn) const - { - if (theColumn == 1 && theRow >= 2 && theRow <= 5) - return ViewControl_EditType_Double; - - return ViewControl_EditType_None; - } - -private: - Quantity_ColorRGBA myColor; - ViewControl_ColorSelector* mySelector; -}; - -//! Table of parameters: Red, Green, Blue, Alpha, OCCT color name -class ViewControl_OCCTColorModel : public QAbstractTableModel -{ -public: - ViewControl_OCCTColorModel(QObject* theParent) - : QAbstractTableModel(theParent), - myCurrentIndexKind(ViewControl_ColorDelegateKind_None) - { - } - - virtual ~ViewControl_OCCTColorModel() {} - - //! Sets current color, that should have custom presented - //! \param theColor current color - //! \param theKind presentation kind - void SetColor(const Quantity_NameOfColor& theColor, const ViewControl_ColorDelegateKind theKind) - { - int aColorPosition = (int)theColor; - int aRow = (int)(aColorPosition / columnCount()); - int aColumn = aColorPosition - aRow * columnCount(); - myCurrentIndex = index(aRow, aColumn); - myCurrentIndexKind = theKind; - - emit layoutChanged(); - } - - //! Returns OCCT name of color if index position does not exceed Quantity_NameOfColor elements - //! \param theIndex model index - //! \param theNameOfColor [out] OCCT color name - //! \return true if the color is found - bool GetOCCTColor(const QModelIndex& theIndex, Quantity_NameOfColor& theNameOfColor) const - { - int aNameOfColorId = theIndex.row() * columnCount() + theIndex.column(); - if (aNameOfColorId > Quantity_NOC_WHITE) - return false; - theNameOfColor = (Quantity_NameOfColor)aNameOfColorId; - return true; - } - - //! Returns index that has custom presentation - //! \return model index - QModelIndex GetCurrentIndex() const { return myCurrentIndex; } - - //! Returns index color kind that has custom presentation - //! \return kind - ViewControl_ColorDelegateKind GetCurrentIndexKind() const { return myCurrentIndexKind; } - - //! Returns item information(short) for display role. - //! \param theIndex a model index - //! \param theRole a view role - //! \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE - { - if (theRole != Qt::ToolTipRole) // background is processed in table item delegate - return QVariant(); - - Quantity_NameOfColor aNameOfColor; - if (!GetOCCTColor(theIndex, aNameOfColor)) - return QVariant(); - - if (theRole == Qt::ToolTipRole) - return QString("%1").arg( - ViewControl_ColorSelector::ColorToString(Quantity_Color(aNameOfColor))); - return QVariant(); - } - - //! Returns number of tree level line items = columns in table view - virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 26; - } - - //! Returns only one row in table view - virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE - { - (void)theParent; - return 20; - } - - //! Returns color for the delegate kind - //! \param theKind kind - //! \return color - static QColor GetKindColor(const ViewControl_ColorDelegateKind theKind) - { - switch (theKind) - { - case ViewControl_ColorDelegateKind_Activated: - case ViewControl_ColorDelegateKind_Highlighted: - return Qt::blue; - case ViewControl_ColorDelegateKind_Selected: - return Qt::black; - default: - break; - } - return QColor(); - } - -private: - QModelIndex myCurrentIndex; //!< index to be presented through item delegate - ViewControl_ColorDelegateKind myCurrentIndexKind; //!< kind of custom item -}; - -//! \class DFBrowser_HighlightDelegate -//! \brief An item delegate to paint in highlight color the cell when the mouse cursor is over it -class ViewControl_OCCTColorDelegate : public QItemDelegate -{ -public: - //! Constructor - ViewControl_OCCTColorDelegate(QObject* theParent = 0) - : QItemDelegate(theParent) - { - } - - //! Destructor - virtual ~ViewControl_OCCTColorDelegate() Standard_OVERRIDE {} - - //! Redefine of the parent virtual method to color the cell rectangle in highlight style - //! \param thePainter a painter - //! \param theOption a paint options - //! \param theIndex a view index - virtual void paint(QPainter* thePainter, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const Standard_OVERRIDE - { - QRect aBaseRect = theOption.rect; - int aNameOfColorId = - theIndex.row() * theIndex.model()->columnCount(theIndex) + theIndex.column(); - Quantity_NameOfColor aNameOfColor = Quantity_NOC_WHITE; - if (aNameOfColorId < (int)Quantity_NOC_WHITE) - aNameOfColor = (Quantity_NameOfColor)aNameOfColorId; - - Quantity_Color anOCCTColor(aNameOfColor); - QColor aQColor = ViewControl_ColorSelector::ColorToQColor(Quantity_ColorRGBA(anOCCTColor)); - thePainter->fillRect(aBaseRect, aQColor); - - QColor aColor; - // highlight cell - if (theOption.state & QStyle::State_MouseOver) - aColor = ViewControl_OCCTColorModel::GetKindColor(ViewControl_ColorDelegateKind_Highlighted); - else - { - const ViewControl_OCCTColorModel* aTableModel = - dynamic_cast(theIndex.model()); - QModelIndex anIndex = aTableModel->GetCurrentIndex(); - if (anIndex.isValid() && anIndex.row() == theIndex.row() - && anIndex.column() == theIndex.column()) - aColor = ViewControl_OCCTColorModel::GetKindColor(aTableModel->GetCurrentIndexKind()); - } - - if (aColor.isValid()) - { - int aRectSize = 2; - thePainter->fillRect( - QRect(aBaseRect.topLeft(), - QPoint(aBaseRect.bottomLeft().x() + aRectSize, aBaseRect.bottomLeft().y())), - aColor); - thePainter->fillRect( - QRect(QPoint(aBaseRect.topRight().x() - aRectSize, aBaseRect.topRight().y()), - aBaseRect.bottomRight()), - aColor); - thePainter->fillRect( - QRect(QPoint(aBaseRect.topLeft().x() + aRectSize, aBaseRect.topLeft().y()), - QPoint(aBaseRect.topRight().x() - aRectSize, aBaseRect.topRight().y() + aRectSize)), - aColor); - thePainter->fillRect( - QRect( - QPoint(aBaseRect.bottomLeft().x() + aRectSize, aBaseRect.bottomLeft().y() - aRectSize), - QPoint(aBaseRect.bottomRight().x() - aRectSize, aBaseRect.bottomRight().y())), - aColor); - } - } -}; - -//! Color picker class -class ViewControl_ColorPicker : public QWidget -{ -public: - ViewControl_ColorPicker(QWidget* theParent) - : QWidget(theParent) - { - } - - virtual ~ViewControl_ColorPicker() {} -}; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ViewControl_ColorSelector::ViewControl_ColorSelector(QWidget* theParent) - : QDialog(theParent) -{ - QGridLayout* aLayout = new QGridLayout(this); - aLayout->setContentsMargins(0, 0, 0, 0); - - myParameters = new QTableView(this); - ViewControl_TableModel* aTableModel = new ViewControl_TableModel(myParameters); - aTableModel->SetModelValues(new ViewControl_ParametersModel(this)); - myParameters->setModel(aTableModel); - - ViewControl_TableItemDelegate* anItemDelegate = new ViewControl_TableItemDelegate(); - anItemDelegate->SetModelValues(aTableModel->ModelValues()); - myParameters->setItemDelegate(anItemDelegate); - - myParameters->verticalHeader()->setDefaultSectionSize( - myParameters->verticalHeader()->minimumSectionSize()); - myParameters->verticalHeader()->setVisible(false); - myParameters->horizontalHeader()->setVisible(false); - myParameters->setMinimumHeight(myParameters->verticalHeader()->minimumSectionSize() - * aTableModel->rowCount() - + TreeModel_Tools::HeaderSectionMargin()); - - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(myParameters->model()); - myParameters->setSelectionMode(QAbstractItemView::SingleSelection); - myParameters->setSelectionModel(aSelectionModel); - - aLayout->addWidget(myParameters, 0, 0); - - myColorPicker = new ViewControl_ColorPicker(this); - aLayout->addWidget(myColorPicker, 0, 1); - - myOCCTColors = new QTableView(this); - myOCCTColors->setFixedSize(525, 405); - myOCCTColors->verticalHeader()->setDefaultSectionSize(20); - myOCCTColors->verticalHeader()->setVisible(false); - myOCCTColors->horizontalHeader()->setDefaultSectionSize(20); - myOCCTColors->horizontalHeader()->setVisible(false); - myOCCTColors->setModel(new ViewControl_OCCTColorModel(myOCCTColors)); - - myOCCTColors->viewport()->setAttribute(Qt::WA_Hover); - myOCCTColors->setItemDelegate(new ViewControl_OCCTColorDelegate(myOCCTColors)); - - aSelectionModel = new QItemSelectionModel(myOCCTColors->model()); - myOCCTColors->setSelectionMode(QAbstractItemView::SingleSelection); - myOCCTColors->setSelectionModel(aSelectionModel); - connect(aSelectionModel, - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onOCCTColorsTableSelectionChanged(const QItemSelection&, const QItemSelection&))); - aLayout->addWidget(myOCCTColors, 1, 0, 1, 2); - - QWidget* aBtnWidget = new QWidget(this); - aLayout->addWidget(aBtnWidget, 2, 0, 1, 2); - - QHBoxLayout* aBtnLayout = new QHBoxLayout(aBtnWidget); - myOkButton = new QPushButton("Ok", aBtnWidget); - myCancelButton = new QPushButton("Cancel", aBtnWidget); - connect(myOkButton, SIGNAL(clicked()), this, SLOT(accept())); - connect(myCancelButton, SIGNAL(clicked()), this, SLOT(reject())); - aBtnLayout->addStretch(); - aBtnLayout->addWidget(myOkButton); - aBtnLayout->addWidget(myCancelButton); -} - -// ======================================================================= -// function : SetStreamValue -// purpose : -// ======================================================================= -void ViewControl_ColorSelector::SetStreamValue(const QString& theValue) -{ - Quantity_ColorRGBA aColor = StringToColorRGBA(theValue); - // parameters model - ViewControl_TableModel* aTableModel = - dynamic_cast(myParameters->model()); - ViewControl_ParametersModel* aParametersModel = - dynamic_cast(aTableModel->ModelValues()); - aParametersModel->SetColor(aColor, aTableModel); - - // OCCT color model - Quantity_NameOfColor aColorName; - bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName); - ViewControl_OCCTColorModel* anOCCTColorModel = - dynamic_cast(myOCCTColors->model()); - anOCCTColorModel->SetColor(aColorName, - isExactColorName ? ViewControl_ColorDelegateKind_Selected - : ViewControl_ColorDelegateKind_Activated); -} - -// ======================================================================= -// function : GetStreamValue -// purpose : -// ======================================================================= -QString ViewControl_ColorSelector::GetStreamValue() const -{ - ViewControl_TableModel* aTableModel = - dynamic_cast(myParameters->model()); - ViewControl_ParametersModel* aParametersModel = - dynamic_cast(aTableModel->ModelValues()); - - Quantity_ColorRGBA aColor = aParametersModel->GetColor(); - - Standard_SStream aStream; - aColor.DumpJson(aStream); - - return Standard_Dump::Text(aStream).ToCString(); -} - -// ======================================================================= -// function : ParameterColorChanged -// purpose : -// ======================================================================= -void ViewControl_ColorSelector::ParameterColorChanged() -{ - ViewControl_TableModel* aTableModel = - dynamic_cast(myParameters->model()); - ViewControl_ParametersModel* aParametersModel = - dynamic_cast(aTableModel->ModelValues()); - Quantity_ColorRGBA aColor = aParametersModel->GetColor(); - - // OCCT color model - Quantity_NameOfColor aColorName; - bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName); - ViewControl_OCCTColorModel* anOCCTColorModel = - dynamic_cast(myOCCTColors->model()); - anOCCTColorModel->SetColor(aColorName, - isExactColorName ? ViewControl_ColorDelegateKind_Selected - : ViewControl_ColorDelegateKind_Activated); -} - -// ======================================================================= -// function : ColorToString -// purpose : -// ======================================================================= -QString ViewControl_ColorSelector::ColorToString(const Quantity_Color& theColor) -{ - Standard_Real aRed, aGreen, aBlue; - theColor.Values(aRed, aGreen, aBlue, Quantity_TOC_RGB); - return QString::number(aRed) + ViewControl_ColorSelector::ColorSeparator() - + QString::number(aGreen) + ViewControl_ColorSelector::ColorSeparator() - + QString::number(aBlue); -} - -// ======================================================================= -// function : ColorToQColor -// purpose : -// ======================================================================= -QColor ViewControl_ColorSelector::ColorToQColor(const Quantity_ColorRGBA& theColor) -{ - int aDelta = 255; - - Standard_Real aRed, aGreen, aBlue; - theColor.GetRGB().Values(aRed, aGreen, aBlue, Quantity_TOC_RGB); - - return QColor((int)(aRed * aDelta), (int)(aGreen * aDelta), (int)(aBlue * aDelta)); -} - -// ======================================================================= -// function : StringToColorRGBA -// purpose : -// ======================================================================= -Quantity_ColorRGBA ViewControl_ColorSelector::StringToColorRGBA(const QString& theColor) -{ - Quantity_ColorRGBA aColorRGBA; - Standard_SStream aStream; - aStream << theColor.toStdString(); - int aStreamPos = 1; - aColorRGBA.InitFromJson(aStream, aStreamPos); - return aColorRGBA; -} - -// ======================================================================= -// function : IsExactColorName -// purpose : -// ======================================================================= -Standard_Boolean ViewControl_ColorSelector::IsExactColorName(const Quantity_ColorRGBA& theColor, - Quantity_NameOfColor& theColorName) -{ - theColorName = theColor.GetRGB().Name(); - return Quantity_Color(theColorName).IsEqual(theColor.GetRGB()); -} - -// ======================================================================= -// function : onOCCTColorsTableSelectionChanged -// purpose : -// ======================================================================= -void ViewControl_ColorSelector::onOCCTColorsTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection&) -{ - QModelIndexList aSelectedIndices = theSelected.indexes(); - if (aSelectedIndices.size() != 1) - return; - - ViewControl_OCCTColorModel* anOCCTColorModel = - dynamic_cast(myOCCTColors->model()); - Quantity_NameOfColor aNameOfColor; - if (!anOCCTColorModel->GetOCCTColor(aSelectedIndices.first(), aNameOfColor)) - return; - - anOCCTColorModel->SetColor(aNameOfColor, ViewControl_ColorDelegateKind_Selected); - - // parameters model - ViewControl_TableModel* aTableModel = - dynamic_cast(myParameters->model()); - ViewControl_ParametersModel* aParametersModel = - dynamic_cast(aTableModel->ModelValues()); - Quantity_Color anOCCTColor(aNameOfColor); - aParametersModel->SetColor(Quantity_ColorRGBA(anOCCTColor), aTableModel); -} diff --git a/tools/ViewControl/ViewControl_ColorSelector.hxx b/tools/ViewControl/ViewControl_ColorSelector.hxx deleted file mode 100644 index b3b7d944e6..0000000000 --- a/tools/ViewControl/ViewControl_ColorSelector.hxx +++ /dev/null @@ -1,93 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_ColorSelector_H -#define ViewControl_ColorSelector_H - -#include - -#include -#include -#include -#include -#include -#include -#include - -class ViewControl_ColorPicker; -class QPushButton; -class QTableView; - -//! \class ViewControl_ColorSelector -//! \brief Selector of OCCT color -class ViewControl_ColorSelector : public QDialog -{ - Q_OBJECT -public: - //! Constructor - ViewControl_ColorSelector(QWidget* theParent); - - //! Destructor - virtual ~ViewControl_ColorSelector() Standard_OVERRIDE {} - - //! Inits control by the color value - //! \param theColor text color value - void SetStreamValue(const QString& theColor); - - //! Returns current selected color value - //! \return text color value - QString GetStreamValue() const; - - //! Updates OCCT color model by changing color in parameter model - void ParameterColorChanged(); - - //! Converts color to string value in form: r;g;b - //! \param theColor color value - //! \return text value - static QString ColorToString(const Quantity_Color& theColor); - - //! Converts color to QColor value in form: r;g;b;a - //! \param theColor color value - //! \return qt color value - static QColor ColorToQColor(const Quantity_ColorRGBA& theColor); - - //! Converts string to color value from a form: r;g;b;a - //! \param theColor text color value - //! \return color value - static Quantity_ColorRGBA StringToColorRGBA(const QString& theColor); - - static Standard_Boolean IsExactColorName(const Quantity_ColorRGBA& theColor, - Quantity_NameOfColor& theColorName); - -private: - //! Returns symbol used as a separator of color components in string conversion - //! \return symbol value - static QString ColorSeparator() { return ";"; } - -private slots: - //! Slots listen selection change and update the current control content by selection - //! \param theSelected container of selected items - //! \param theDeselected container of items that become deselected - void onOCCTColorsTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -private: - QTableView* myParameters; //!< current color parameters (RGB, alpha, color name) - ViewControl_ColorPicker* myColorPicker; //!< color picker - QTableView* myOCCTColors; //!< OCCT color values - QPushButton* myOkButton; //!< accept button - QPushButton* myCancelButton; //!< reject button -}; -#endif diff --git a/tools/ViewControl/ViewControl_EditType.hxx b/tools/ViewControl/ViewControl_EditType.hxx deleted file mode 100644 index 4dc5108511..0000000000 --- a/tools/ViewControl/ViewControl_EditType.hxx +++ /dev/null @@ -1,31 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_EditType_H -#define ViewControl_EditType_H - -//! Type of context used in a tool library -enum ViewControl_EditType -{ - ViewControl_EditType_None, //!< View widget is null - ViewControl_EditType_Bool, //!< check box widget - ViewControl_EditType_Color, //!< color selector widget - ViewControl_EditType_Double, //!< line edit widget used double validator - ViewControl_EditType_Line, //!< line edit widget - ViewControl_EditType_Spin, //!< spin box widget - ViewControl_EditType_DoAction //!< control to perform the row action -}; - -#endif diff --git a/tools/ViewControl/ViewControl_MessageDialog.cxx b/tools/ViewControl/ViewControl_MessageDialog.cxx deleted file mode 100644 index b902c25d88..0000000000 --- a/tools/ViewControl/ViewControl_MessageDialog.cxx +++ /dev/null @@ -1,131 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ViewControl_MessageDialog::ViewControl_MessageDialog(QWidget* theParent, - const QString& theInformation, - const QString& theQuestion) - : QDialog(theParent), - myDoNotShowItAgain(false), - myPreviousAnswer(false), - myInformation(theInformation), - myQuestion(theQuestion) -{ - setWindowTitle("Information"); - - QGridLayout* aLayout = new QGridLayout(this); - QString anInformation = theInformation; - if (!theQuestion.isEmpty()) - anInformation += QString("\n\n%2").arg(myQuestion); - myInformationLabel = new QLabel(anInformation, this); - myInformationLabel->setWordWrap(true); - aLayout->addWidget(myInformationLabel, 0, 0, 1, 3); - - myDoNotShowCheckBox = new QCheckBox("Don't show this dialog again. Do the same next time.", this); - connect(myDoNotShowCheckBox, SIGNAL(toggled(bool)), this, SLOT(onDonNotShowToggled(bool))); - aLayout->addWidget(myDoNotShowCheckBox, 1, 0, 1, 3); - - myOkButton = new QPushButton("Ok", this); - myCancelButton = new QPushButton("Cancel", this); - connect(myOkButton, SIGNAL(clicked()), this, SLOT(onOkClicked())); - connect(myCancelButton, SIGNAL(clicked()), this, SLOT(onCancelClicked())); - aLayout->addWidget(myOkButton, 2, 1); - aLayout->addWidget(myCancelButton, 2, 2); - - aLayout->setColumnStretch(0, 1); - - myCancelButton->setDefault(true); - - SetInformation(theInformation); -} - -// ======================================================================= -// function : Start -// purpose : -// ======================================================================= -void ViewControl_MessageDialog::Start() -{ - if (!myDoNotShowItAgain) - { - QString anInformation = myInformation; - if (!myQuestion.isEmpty()) - anInformation += QString("\n\n%2").arg(myQuestion); - myInformationLabel->setText(anInformation); - exec(); - return; - } - - if (IsAccepted()) - return; - - // tool tip information window - QWidget* aWidget = new QWidget(this, Qt::Popup); - QVBoxLayout* aLayout = new QVBoxLayout(aWidget); - aLayout->addWidget(new QLabel(myInformation, aWidget)); - aWidget->move(QCursor::pos()); - aWidget->show(); -} - -// ======================================================================= -// function : onOkClicked -// purpose : -// ======================================================================= -void ViewControl_MessageDialog::onOkClicked() -{ - myPreviousAnswer = true; - if (myDoNotShowItAgain) - setToolTipInfoMode(); - - accept(); -} - -// ======================================================================= -// function : onCancelClicked -// purpose : -// ======================================================================= -void ViewControl_MessageDialog::onCancelClicked() -{ - myPreviousAnswer = false; - if (myDoNotShowItAgain) - setToolTipInfoMode(); - - reject(); -} - -// ======================================================================= -// function : setToolTipInfoMode -// purpose : -// ======================================================================= -void ViewControl_MessageDialog::setToolTipInfoMode() -{ - // setWindowFlags (Qt::FramelessWindowHint); - // myDoNotShowCheckBox->setVisible (false); - // myOkButton->setVisible (false); - // myCancelButton->setVisible (false); -} diff --git a/tools/ViewControl/ViewControl_MessageDialog.hxx b/tools/ViewControl/ViewControl_MessageDialog.hxx deleted file mode 100644 index 212d2238af..0000000000 --- a/tools/ViewControl/ViewControl_MessageDialog.hxx +++ /dev/null @@ -1,93 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_MessageDialog_H -#define ViewControl_MessageDialog_H - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -class QWidget; - -//! \class ViewControl_MessageDialog -//! Dialog providing information and a question. -//! It has a check box to do not the dialog again. In this case the previous value will be used as a -//! result -class ViewControl_MessageDialog : public QDialog -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT ViewControl_MessageDialog(QWidget* theParent, - const QString& theInformation, - const QString& theQuestion); - - //! Destructor - virtual ~ViewControl_MessageDialog() {} - - //! Fills message dialog with the information - //! \param theInformation text - void SetInformation(const QString& theInformation) { myInformation = theInformation; } - - //! Returns result of the dialog - //! \bool true if the dialog was accepted - bool IsAccepted() { return myPreviousAnswer; } - - //! Either perform exec() for the dialog or show tool tip information depending do not be shown - //! again state - Standard_EXPORT void Start(); - -private slots: - - //! Processing this checkbox, store result in the dialog field to use by the next dialog start - //! \param theState current changed state of the check box - void onDonNotShowToggled(bool theState) { myDoNotShowItAgain = theState; } - - //! Processing action button. Stores accept choice, change dialog state if do not show it again is - //! on - void onOkClicked(); - - //! Processing action button. Stores reject choice, change dialog state if do not show it again is - //! on - void onCancelClicked(); - -private: - //! Changes state of the dialog to message tool tip. Only information control will be shown in the - //! dialog - void setToolTipInfoMode(); - -private: - bool myDoNotShowItAgain; //!< state if the dialog should not be shown again, the latest result is - //!< used as answer - bool myPreviousAnswer; //!< the previous cached result of the dialog - - QString myInformation; //!< the information text - QString myQuestion; //!< the question text - - QLabel* myInformationLabel; //!< message control - QCheckBox* myDoNotShowCheckBox; //!< choice whether the dialog will be shown again - QPushButton* myOkButton; //!< accept button - QPushButton* myCancelButton; //!< reject button -}; - -#endif diff --git a/tools/ViewControl/ViewControl_PropertyView.cxx b/tools/ViewControl/ViewControl_PropertyView.cxx deleted file mode 100644 index fc8650956a..0000000000 --- a/tools/ViewControl/ViewControl_PropertyView.cxx +++ /dev/null @@ -1,220 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//! Class that uses parameter size as recommended size for the widget. -//! If the control is placed in a dock widget of the main window, it will not be resized on free -//! size by resizing the main window. -class ViewControl_PredefinedSizeWidget : public QWidget -{ -public: - //! Constructor - ViewControl_PredefinedSizeWidget(QWidget* theParent, const QSize& theSize) - : QWidget(theParent) - { - SetPredefinedSize(theSize); - } - - //! Destructor - virtual ~ViewControl_PredefinedSizeWidget() {} - - //! Sets default size of control, that is used by the first control show - //! \param theDefaultWidth the width value - //! \param theDefaultHeight the height value - void SetPredefinedSize(const QSize& theSize) { myDefaultSize = theSize; } - - //! Returns predefined size if both values are positive, otherwise parent size hint - virtual QSize sizeHint() const Standard_OVERRIDE - { - return myDefaultSize.isValid() ? myDefaultSize : QWidget::sizeHint(); - } - -private: - QSize myDefaultSize; //!< default size, empty size if it should not be used -}; - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ViewControl_PropertyView::ViewControl_PropertyView(QWidget* theParent, - const QSize& thePredefinedSize) - : QObject(theParent), - myOwnSelectionChangeBlocked(false) -{ - myMainWidget = new ViewControl_PredefinedSizeWidget(theParent, QSize(1, 100)); - if (!thePredefinedSize.isEmpty()) - ((ViewControl_PredefinedSizeWidget*)myMainWidget)->SetPredefinedSize(thePredefinedSize); - - QVBoxLayout* aLayout = new QVBoxLayout(myMainWidget); - aLayout->setContentsMargins(0, 0, 0, 0); - - QScrollArea* anArea = new QScrollArea(myMainWidget); - - myAttributesStack = new QStackedWidget(myMainWidget); - anArea->setWidget(myAttributesStack); - anArea->setWidgetResizable(true); - aLayout->addWidget(anArea); - - myEmptyWidget = new QWidget(myAttributesStack); - myAttributesStack->addWidget(myEmptyWidget); - - myTableWidget = new QWidget(myAttributesStack); - myTableWidgetLayout = new QVBoxLayout(myTableWidget); - myTableWidgetLayout->setContentsMargins(0, 0, 0, 0); - myAttributesStack->addWidget(myTableWidget); - - myAttributesStack->setCurrentWidget(myEmptyWidget); - - // create table - ViewControl_Table* aTable = new ViewControl_Table(myMainWidget); - ViewControl_TableModel* aModel = new ViewControl_TableModel(aTable->TableView()); - aTable->SetModel(aModel); - - connect(aTable->TableView()->selectionModel(), - SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, - SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&))); - - connect(aModel, - SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector&)), - this, - SIGNAL(propertyViewDataChanged())); - - myTableWidgetLayout->addWidget(aTable->GetControl()); - myTable = aTable; -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void ViewControl_PropertyView::Init(ViewControl_TableModelValues* theTableValues) -{ - ViewControl_Table* aTable = Table(); - if (theTableValues) - { - aTable->Init(theTableValues); - ViewControl_Tools::SetDefaultHeaderSections(aTable->TableView(), Qt::Horizontal); - } - aTable->SetActive(theTableValues != 0); - - if (theTableValues) - myAttributesStack->setCurrentWidget(myTableWidget); - else - myAttributesStack->setCurrentWidget(myEmptyWidget); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void ViewControl_PropertyView::Init(QWidget*) {} - -// ======================================================================= -// function : ClearActiveTablesSelection -// purpose : -// ======================================================================= -void ViewControl_PropertyView::ClearActiveTablesSelection() -{ - bool aWasBlocked = myOwnSelectionChangeBlocked; - myOwnSelectionChangeBlocked = true; - - QList aTables; - ViewControl_Table* aTable = Table(); - if (aTable->IsActive()) - aTable->TableView()->selectionModel()->clearSelection(); - - myOwnSelectionChangeBlocked = aWasBlocked; -} - -// ======================================================================= -// function : Clear -// purpose : -// ======================================================================= -void ViewControl_PropertyView::Clear() -{ - ViewControl_Table* aTable = Table(); - if (aTable->IsActive()) - { - ViewControl_TableModel* aModel = - dynamic_cast(aTable->TableView()->model()); - aModel->SetModelValues(0); - - aTable->SetActive(true); - } - myAttributesStack->setCurrentWidget(myEmptyWidget); -} - -// ======================================================================= -// function : SaveState -// purpose : -// ======================================================================= -void ViewControl_PropertyView::SaveState(ViewControl_PropertyView* thePropertyView, - QMap& theItems, - const QString& thePrefix) -{ - ViewControl_Table* aTable = thePropertyView->Table(); - int aColumnWidth = aTable->TableView()->columnWidth(0); - theItems[thePrefix + "column_width_0"] = QString::number(aColumnWidth); -} - -// ======================================================================= -// function : RestoreState -// purpose : -// ======================================================================= -bool ViewControl_PropertyView::RestoreState(ViewControl_PropertyView* thePropertyView, - const QString& theKey, - const QString& theValue, - const QString& thePrefix) -{ - if (theKey == thePrefix + "column_width_0") - { - bool isOk; - int aWidth = theValue.toInt(&isOk); - if (isOk) - thePropertyView->Table()->TableView()->horizontalHeader()->setDefaultSectionSize(aWidth); - } - else - return false; - return true; -} - -// ======================================================================= -// function : onTableSelectionChanged -// purpose : -// ======================================================================= -void ViewControl_PropertyView::onTableSelectionChanged(const QItemSelection&, const QItemSelection&) -{ - if (myOwnSelectionChangeBlocked) - return; - - emit propertyViewSelectionChanged(); -} diff --git a/tools/ViewControl/ViewControl_PropertyView.hxx b/tools/ViewControl/ViewControl_PropertyView.hxx deleted file mode 100644 index ba8a4b3b06..0000000000 --- a/tools/ViewControl/ViewControl_PropertyView.hxx +++ /dev/null @@ -1,119 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TreeModel_PropertyView_H -#define TreeModel_PropertyView_H - -#include -#include - -#include - -#include -#include -#include -#include - -class QAbstractTableModel; -class QStackedWidget; -class QWidget; -class QVBoxLayout; - -class ViewControl_TableModelValues; - -//! \class ViewControl_PropertyView -//! \brief View widget where several tables are visualized in vertical layout. -class ViewControl_PropertyView : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT ViewControl_PropertyView(QWidget* theParent, - const QSize& thePredefinedSize = QSize()); - - //! Destructor - virtual ~ViewControl_PropertyView() {} - - //! Fills the view content with values. Number of visible tables is size of container, - //! Each element of container is values of the corresponded table - //! \param theTableValues values - Standard_EXPORT void Init(ViewControl_TableModelValues* theTableValues); - - //! Fills the view content with the parameter custom widget. - //! \param theWidget control - Standard_EXPORT void Init(QWidget* theWidget); - - //! Clears layout of the view and tables models. - Standard_EXPORT void Clear(); - - //! \return the text edit control - QWidget* GetControl() const { return myMainWidget; } - - //! Returns container an active table or NULL - ViewControl_Table* Table() { return myTable; } - - //! Clears selection in active tables - Standard_EXPORT void ClearActiveTablesSelection(); - - //! Saves state of property view in a container in form: key, value. It saves: - //! - visibility of columns, - //! - columns width - //! \param theTreeView a view instance - //! \param[out] theItems properties - //! \param thePrefix preference item prefix - Standard_EXPORT static void SaveState(ViewControl_PropertyView* theParameters, - QMap& theItems, - const QString& thePrefix = QString()); - - //! Restores state of property view by a container - //! \param theTreeView a view instance - //! \param theKey property key - //! \param theValue property value - //! \param thePrefix preference item prefix - //! \return boolean value whether the property is applied to the tree view - Standard_EXPORT static bool RestoreState(ViewControl_PropertyView* theParameters, - const QString& theKey, - const QString& theValue, - const QString& thePrefix = QString()); - -signals: - //! Signal about selection change in property view table - void propertyViewSelectionChanged(); - - //! Signal about data change in property view table - void propertyViewDataChanged(); - -protected slots: - //! Emits signal about selection is changed - //! \param theSelected container of selected table cells - //! \param theDeselected container of selected table cells - void onTableSelectionChanged(const QItemSelection& theSelected, - const QItemSelection& theDeselected); - -private: - bool myOwnSelectionChangeBlocked; //!< blocking emit of selection changed signal - - QWidget* myMainWidget; //!< parent of all controls - - QStackedWidget* myAttributesStack; //!< container of already created panes - QWidget* myEmptyWidget; //!< an empty widget when nothing is selected in tree view - - QWidget* myTableWidget; //!< widget of tables in vertical layout - QVBoxLayout* - myTableWidgetLayout; //!< main view layout where tables or custom widgets are presented - ViewControl_Table* myTable; //!< table view, shown only first tables filled in Init method - QWidget* myCustomWidget; //!< custom view widget -}; -#endif diff --git a/tools/ViewControl/ViewControl_Table.cxx b/tools/ViewControl/ViewControl_Table.cxx deleted file mode 100644 index fc3149536f..0000000000 --- a/tools/ViewControl/ViewControl_Table.cxx +++ /dev/null @@ -1,178 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ViewControl_Table::ViewControl_Table(QWidget* theParent) - : QObject(theParent), - myIsUseProperty(false) -{ - myMainWidget = new QWidget(theParent); - QGridLayout* aLayout = new QGridLayout(myMainWidget); - aLayout->setContentsMargins(0, 0, 0, 0); - - myTableView = new QTableView(myMainWidget); - myTableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - - myTableView->setItemDelegate(new ViewControl_TableItemDelegate(theParent)); - - QHeaderView* aVHeader = myTableView->verticalHeader(); - int aDefCellSize = aVHeader->minimumSectionSize(); - aVHeader->setDefaultSectionSize(aDefCellSize); - - connect(myTableView->horizontalHeader(), - SIGNAL(sectionResized(int, int, int)), - this, - SLOT(onHeaderResized(int, int, int))); - - aLayout->addWidget(myTableView); -} - -// ======================================================================= -// function : SetModel -// purpose : -// ======================================================================= -void ViewControl_Table::SetModel(QAbstractTableModel* theModel) -{ - myTableView->setModel(theModel); - - myTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); - QItemSelectionModel* aSelectionModel = new QItemSelectionModel(theModel); - myTableView->setSelectionModel(aSelectionModel); -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -void ViewControl_Table::Init(ViewControl_TableModelValues* theModelValues) -{ - myTableView->selectionModel()->clearSelection(); - - ViewControl_TableModel* aModel = dynamic_cast(myTableView->model()); - aModel->SetModelValues(theModelValues); - - myTableView->horizontalHeader()->setVisible(theModelValues->IsHeaderVisible(Qt::Horizontal)); - - ViewControl_TableItemDelegate* anItemDelegate = - dynamic_cast(myTableView->itemDelegate()); - anItemDelegate->SetModelValues(theModelValues); - - myTableView->verticalHeader()->setVisible(theModelValues->IsHeaderVisible(Qt::Vertical)); - int aSectionSize; - if (theModelValues->DefaultSectionSize(Qt::Vertical, aSectionSize)) - { - myTableView->verticalHeader()->setDefaultSectionSize(aSectionSize); - } - else - myTableView->verticalHeader()->setDefaultSectionSize( - myTableView->verticalHeader()->minimumSectionSize()); - - aModel->EmitLayoutChanged(); -} - -// ======================================================================= -// function : SelectedIndices -// purpose : -// ======================================================================= -void ViewControl_Table::SelectedIndices(QMap>& theSelectedIndices) const -{ - QModelIndexList aSelected = myTableView->selectionModel()->selectedIndexes(); - - int aRow, aColumn; - for (QModelIndexList::const_iterator anIt = aSelected.begin(); anIt != aSelected.end(); anIt++) - { - QModelIndex anIndex = *anIt; - aRow = anIndex.row(); - aColumn = anIndex.column(); - if (!theSelectedIndices.contains(aRow)) - theSelectedIndices.insert(aRow, QList()); - theSelectedIndices[aRow].append(aColumn); - } -} - -// ======================================================================= -// function : SeparatorData -// purpose : -// ======================================================================= -QString ViewControl_Table::SeparatorData() -{ - return ViewControl_Tools::TableSeparator(); -} - -// ======================================================================= -// function : SelectedPointers -// purpose : -// ======================================================================= -void ViewControl_Table::SelectedPointers(QStringList& thePointers) const -{ - QMap> aSelectedIndices; - SelectedIndices(aSelectedIndices); - - ViewControl_TableModel* aTableModel = dynamic_cast(TableView()->model()); - ViewControl_TableModelValues* aTableValues = aTableModel->ModelValues(); - - for (QMap>::const_iterator aSelIt = aSelectedIndices.begin(); - aSelIt != aSelectedIndices.end(); - aSelIt++) - { - int aRowId = aSelIt.key(); - QList aColIds = aSelIt.value(); - for (int aColId = 0; aColId < aColIds.size(); aColId++) - { - int aSelectedColId = aColIds[aColId]; - if (aSelectedColId != 1) - continue; - - QString aData = aTableValues->Data(aRowId, aSelectedColId, Qt::DisplayRole).toString(); - if (aData.contains(Standard_Dump::GetPointerPrefix().ToCString())) - thePointers.append(aData); - } - } -} - -// ======================================================================= -// function : onHeaderResized -// purpose : -// ======================================================================= -void ViewControl_Table::onHeaderResized(int theSectionId, int, int) -{ - if (theSectionId != 0) - return; - - myTableView->horizontalHeader()->setDefaultSectionSize(myTableView->columnWidth(theSectionId)); -} diff --git a/tools/ViewControl/ViewControl_Table.hxx b/tools/ViewControl/ViewControl_Table.hxx deleted file mode 100644 index 93e392b970..0000000000 --- a/tools/ViewControl/ViewControl_Table.hxx +++ /dev/null @@ -1,98 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_Table_H -#define ViewControl_Table_H - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -class ViewControl_TableModelValues; - -class QAbstractTableModel; -class QContextMenuEvent; -class QWidget; - -//! \class ViewControl_Table -//! \brief View to display table values with possibility to change table columns -//! if the table has 1D dimension and Horizontal orientation -class ViewControl_Table : public QObject -{ - Q_OBJECT -public: - //! Constructor - Standard_EXPORT ViewControl_Table(QWidget* theParent); - - //! Destructor - virtual ~ViewControl_Table() {} - - //! Sets model into table view, init selection model by the given model, connect to selection - //! change \param theModel table values model - void SetModel(QAbstractTableModel* theModel); - - //! Fills table view and table size control by the model - //! \param theModel values model - Standard_EXPORT void Init(ViewControl_TableModelValues* theModelValues); - - //! true if the table is used in property view and visible - bool IsActive() const { return myIsActive; } - - //! Sets the table active and show the table - //! \param theState boolean value - void SetActive(const bool theState) - { - myIsActive = theState; - TableView()->setVisible(theState); - } - - //! \return the text edit control - QWidget* GetControl() const { return myMainWidget; } - - //! \return the table view - QTableView* TableView() const { return myTableView; } - - //! Returns model indices of the selected cells in table view - //! \param[out] theSelectedIndices a container of indices: row to list of columns - Standard_EXPORT void SelectedIndices(QMap>& aSelectedIndices) const; - - //! Returns pointers from selected cells - Standard_EXPORT void SelectedPointers(QStringList& thePointers) const; - - //! Returns text of separation row in table - //! \return string value - Standard_EXPORT static QString SeparatorData(); - -protected slots: - void onHeaderResized(int theSectionId, int, int); - -private: - bool myIsActive; //!< true if the table is used in property view and visible - - QWidget* myMainWidget; //!< parent of all controls - bool myIsUseProperty; //!< boolean value whether the property control should be shown/hidden - QTableView* myTableView; //!< table view -}; -#endif diff --git a/tools/ViewControl/ViewControl_TableItemDelegate.cxx b/tools/ViewControl/ViewControl_TableItemDelegate.cxx deleted file mode 100644 index 70d70dce02..0000000000 --- a/tools/ViewControl/ViewControl_TableItemDelegate.cxx +++ /dev/null @@ -1,220 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -ViewControl_TableItemDelegate::ViewControl_TableItemDelegate(QObject* theParent) - : QItemDelegate(theParent), - myModelValues(0) -{ -} - -// ======================================================================= -// function : createEditor -// purpose : -// ======================================================================= -QWidget* ViewControl_TableItemDelegate::createEditor(QWidget* theParent, - const QStyleOptionViewItem&, - const QModelIndex& theIndex) const -{ - if (!myModelValues) - return 0; - - int aRow = theIndex.row(); - int aColumn = theIndex.column(); - ViewControl_EditType anEditType = myModelValues->EditType(aRow, aColumn); - - QWidget* anEditor = createEditorControl(theParent, anEditType); - initEditorParameters(anEditor, anEditType, myModelValues, aRow, aColumn); - return anEditor; -} - -// ======================================================================= -// function : setEditorData -// purpose : -// ======================================================================= -void ViewControl_TableItemDelegate::setEditorData(QWidget* theEditor, - const QModelIndex& theIndex) const -{ - if (!myModelValues) - return; - - int aRow = theIndex.row(); - int aColumn = theIndex.column(); - ViewControl_EditType anEditType = myModelValues->EditType(aRow, aColumn); - - setEditorValue(theEditor, anEditType, theIndex.model()->data(theIndex)); -} - -// ======================================================================= -// function : setModelData -// purpose : -// ======================================================================= -void ViewControl_TableItemDelegate::setModelData(QWidget* theEditor, - QAbstractItemModel* theModel, - const QModelIndex& theIndex) const -{ - if (!myModelValues) - return; - - int aRow = theIndex.row(); - int aColumn = theIndex.column(); - ViewControl_EditType anEditType = myModelValues->EditType(aRow, aColumn); - theModel->setData(theIndex, getEditorValue(theEditor, anEditType)); -} - -// ======================================================================= -// function : createEditorControl -// purpose : -// ======================================================================= -QWidget* ViewControl_TableItemDelegate::createEditorControl(QWidget* theParent, - const ViewControl_EditType theEditType) -{ - switch (theEditType) - { - case ViewControl_EditType_None: - return 0; - case ViewControl_EditType_Bool: - return new QComboBox(theParent); - case ViewControl_EditType_Color: - return new ViewControl_ColorSelector(theParent); - case ViewControl_EditType_Double: { - QLineEdit* aLineEdit = new QLineEdit(theParent); - aLineEdit->setValidator(new QDoubleValidator(theParent)); - return aLineEdit; - } - case ViewControl_EditType_Line: - return new QLineEdit(theParent); - case ViewControl_EditType_Spin: { - QSpinBox* aSpinBox = new QSpinBox(theParent); - aSpinBox->setRange(IntegerFirst(), IntegerLast()); - return aSpinBox; - } - case ViewControl_EditType_DoAction: - return new QPushButton(theParent); - - default: - return 0; - } -} - -// ======================================================================= -// function : initEditorParameters -// purpose : -// ======================================================================= -void ViewControl_TableItemDelegate::initEditorParameters(QWidget* theEditor, - const ViewControl_EditType theEditType, - ViewControl_TableModelValues*, - const int, - const int) -{ - switch (theEditType) - { - case ViewControl_EditType_Bool: { - (qobject_cast(theEditor))->insertItem(0, "true"); - (qobject_cast(theEditor))->insertItem(1, "false"); - break; - } - case ViewControl_EditType_Double: { - } - default: - break; - } -} - -// ======================================================================= -// function : setEditorValue -// purpose : -// ======================================================================= -void ViewControl_TableItemDelegate::setEditorValue(QWidget* theEditor, - const ViewControl_EditType theEditType, - const QVariant& theValue) const -{ - switch (theEditType) - { - case ViewControl_EditType_None: - break; - case ViewControl_EditType_Bool: - (qobject_cast(theEditor))->setCurrentIndex(theValue.toBool() ? 0 : 1); - break; - case ViewControl_EditType_Color: { - if (!myModelValues) - break; - - const TCollection_AsciiString& aStreamValue = myModelValues->Properties()->StreamValue(); - (qobject_cast(theEditor)) - ->SetStreamValue(aStreamValue.ToCString()); - break; - } - case ViewControl_EditType_Double: - case ViewControl_EditType_Line: - (qobject_cast(theEditor))->setText(theValue.toString()); - break; - case ViewControl_EditType_Spin: - (qobject_cast(theEditor))->setValue(theValue.toInt()); - break; - case ViewControl_EditType_DoAction: - (qobject_cast(theEditor))->setText("UnSelect"); - break; - default: - break; - } -} - -// ======================================================================= -// function : getEditorValue -// purpose : -// ======================================================================= - -QVariant ViewControl_TableItemDelegate::getEditorValue(QWidget* theEditor, - const ViewControl_EditType theEditType) -{ - switch (theEditType) - { - case ViewControl_EditType_None: - return QVariant(); - case ViewControl_EditType_Bool: - return (qobject_cast(theEditor))->currentIndex() == 0 ? true : false; - case ViewControl_EditType_Color: - return (qobject_cast(theEditor))->GetStreamValue(); - case ViewControl_EditType_Double: - case ViewControl_EditType_Line: - return (qobject_cast(theEditor))->text(); - case ViewControl_EditType_Spin: - return (qobject_cast(theEditor))->value(); - case ViewControl_EditType_DoAction: - return QVariant("Clicked"); - default: - return QVariant(); - } -} diff --git a/tools/ViewControl/ViewControl_TableItemDelegate.hxx b/tools/ViewControl/ViewControl_TableItemDelegate.hxx deleted file mode 100644 index 26b08bfbc3..0000000000 --- a/tools/ViewControl/ViewControl_TableItemDelegate.hxx +++ /dev/null @@ -1,107 +0,0 @@ -// Created on: 2021-04-27 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2021 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_TableItemDelegate_H -#define ViewControl_TableItemDelegate_H - -#include -#include - -#include -#include -#include - -class ViewControl_TableModelValues; - -//! \class ViewControl_TableItemDelegate -//! \brief This is an implementation for table cell editor -class ViewControl_TableItemDelegate : public QItemDelegate -{ -public: - //! Constructor - //! \param theParent parent object - Standard_EXPORT ViewControl_TableItemDelegate(QObject* theParent = 0); - - //! Destructor - virtual ~ViewControl_TableItemDelegate() Standard_OVERRIDE {} - - //! Sets table model values - //! \param theModelValues instance of model values - void SetModelValues(ViewControl_TableModelValues* theModelValues) - { - myModelValues = theModelValues; - } - - //! Creates widget editor: spin box, combo box or line edit - //! \param theParent parent widget - //! \param theOption style option - //! \param theIndex index of requested widget - virtual QWidget* createEditor(QWidget* theParent, - const QStyleOptionViewItem& theOption, - const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Sets the data to be displayed and edited by the editor from the data model item specified by - //! the model index \param theEditor editor to be filled \param theIndex index of requested - //! widget, contains information about model - virtual void setEditorData(QWidget* theEditor, - const QModelIndex& theIndex) const Standard_OVERRIDE; - - //! Gets data from the editor widget and stores it in the specified model at the item index. - //! \param theEditor editor to be filled - //! \param theModel data model - //! \param theIndex index of requested widget, contains information about model - virtual void setModelData(QWidget* theEditor, - QAbstractItemModel* theModel, - const QModelIndex& theIndex) const Standard_OVERRIDE; - -private: - //! Creates an editor - //! \param theParent parent widget - //! \param theEditType edition control type - //! \return edit control - static QWidget* createEditorControl(QWidget* theParent, const ViewControl_EditType theEditType); - - //! Inits an editor by model values parameters - //! \param theEditor editor - //! \param theEditType edition control type - //! \param theModelValues custom implementation to provide parameters - //! \param theRow a model index row - //! \param theColumn a model index column - //! \return edit control - static void initEditorParameters(QWidget* theEditor, - const ViewControl_EditType theEditType, - ViewControl_TableModelValues* theModelValues, - const int theRow, - const int theColumn); - - //! Sets editor value - //! \param theEditor editor - //! \param theEditType editor typ - //! \param theValue new value - void setEditorValue(QWidget* theEditor, - const ViewControl_EditType theEditType, - const QVariant& theValue) const; - - //! Returns value of spin box editor - //! \param theEditor editor - //! \param theEditType editor typ - //! \return current value - static QVariant getEditorValue(QWidget* theEditor, const ViewControl_EditType theEditType); - -private: - ViewControl_TableModelValues* myModelValues; //!< table model values -}; - -#endif diff --git a/tools/ViewControl/ViewControl_TableModel.cxx b/tools/ViewControl/ViewControl_TableModel.cxx deleted file mode 100644 index 1151332c2d..0000000000 --- a/tools/ViewControl/ViewControl_TableModel.cxx +++ /dev/null @@ -1,84 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -// ======================================================================= -// function : SetModelValues -// purpose : -// ======================================================================= -void ViewControl_TableModel::SetModelValues(ViewControl_TableModelValues* theModelValues) -{ - if (myModelValues) - delete myModelValues; - - myModelValues = theModelValues; -} - -// ======================================================================= -// function : columnCount -// purpose : -// ======================================================================= -int ViewControl_TableModel::columnCount(const QModelIndex& theParent) const -{ - if (!myModelValues) - return 0; - - return myModelValues->ColumnCount(theParent); -} - -// ======================================================================= -// function : rowCount -// purpose : -// ======================================================================= -int ViewControl_TableModel::rowCount(const QModelIndex& theParent) const -{ - if (!myModelValues) - return 0; - - return myModelValues->RowCount(theParent); -} - -// ======================================================================= -// function : data -// purpose : -// ======================================================================= -QVariant ViewControl_TableModel::data(const QModelIndex& theIndex, int theRole) const -{ - if (!myModelValues) - return QVariant(); - - int aRow = theIndex.row(), aColumn = theIndex.column(); - return myModelValues->Data(aRow, aColumn, theRole); -} - -// ======================================================================= -// function : setData -// purpose : -// ======================================================================= -bool ViewControl_TableModel::setData(const QModelIndex& theIndex, - const QVariant& theValue, - int theRole) -{ - if (!myModelValues) - return false; - - int aRow = theIndex.row(), aColumn = theIndex.column(); - bool aResult = myModelValues->SetData(aRow, aColumn, theValue, theRole); - - emit dataChanged(theIndex, theIndex); - - return aResult; -} diff --git a/tools/ViewControl/ViewControl_TableModel.hxx b/tools/ViewControl/ViewControl_TableModel.hxx deleted file mode 100644 index 8bbb51ed45..0000000000 --- a/tools/ViewControl/ViewControl_TableModel.hxx +++ /dev/null @@ -1,111 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_TableModel_H -#define ViewControl_TableModel_H - -#include - -#include - -#include -#include -#include -#include -#include - -#include - -//! \class ViewControl_TableModel -//! \brief This is an extension of table model to visualize a container of values -//! It is possible to: -//! - set orientation to interpret the values. -//! - set table view header values. -//! Items of the view are enabled and selectable. -class ViewControl_TableModel : public QAbstractTableModel -{ -public: - //! Constructor - ViewControl_TableModel(QObject* theParent = 0) - : myModelValues(0) - { - (void)theParent; - } - - //! Destructor - virtual ~ViewControl_TableModel() {} - - //! Returns instance of interface for access totable values - //! \return interface or NULL - ViewControl_TableModelValues* ModelValues() const { return myModelValues; } - - //! Sets interface to table values - //! \theModelValues instance of values - Standard_EXPORT void SetModelValues(ViewControl_TableModelValues* theModelValues); - - //! Emits the layoutChanged signal from outside of this class - void EmitLayoutChanged() { emit layoutChanged(); } - - //! Returns number of columns, depending on orientation: myColumnCount or size of values container - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns number of rows, depending on orientation: myColumnCount or size of values container - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const - Standard_OVERRIDE; - - //! Returns content of the model index for the given role, it is obtained from internal container - //! of values It returns value only for DisplayRole. \param theIndex a model index \param theRole - //! a view role \return value interpreted depending on the given role - Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE; - - //! Sets the new value of passed role to tree cell. - //! \param[in] index refers to item in tree. - //! \param[in] value the new value. - //! \param[in] role the role of value. - Standard_EXPORT virtual bool setData(const QModelIndex& theIndex, - const QVariant& theValue, - int theRole) Standard_OVERRIDE; - - //! Returns content of the model index for the given role, it is obtainer from internal container - //! of header values It returns value only for DisplayRole. \param theSection an index of value in - //! the container \param theIndex a model index \param theRole a view role \return value - //! interpreted depending on the given role - virtual QVariant headerData(int theSection, - Qt::Orientation theOrientation, - int theRole = Qt::DisplayRole) const Standard_OVERRIDE - { - return myModelValues ? myModelValues->HeaderData(theSection, theOrientation, theRole) - : QVariant(); - } - - //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable - //! \param theIndex a model index - //! \return flags - virtual Qt::ItemFlags flags(const QModelIndex& theIndex) const Standard_OVERRIDE - { - return myModelValues ? myModelValues->Flags(theIndex) : Qt::NoItemFlags; - } - -private: - ViewControl_TableModelValues* myModelValues; //!< interface to table values -}; - -#endif diff --git a/tools/ViewControl/ViewControl_TableModelValues.cxx b/tools/ViewControl/ViewControl_TableModelValues.cxx deleted file mode 100644 index f9bd786f28..0000000000 --- a/tools/ViewControl/ViewControl_TableModelValues.cxx +++ /dev/null @@ -1,152 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -// ======================================================================= -// function : ColumnCount -// purpose : -// ======================================================================= - -int ViewControl_TableModelValues::ColumnCount(const QModelIndex&) const -{ - if (!Properties().IsNull()) - return Properties()->ColumnCount(); - - return 0; -} - -// ======================================================================= -// function : RowCount -// purpose : -// ======================================================================= - -int ViewControl_TableModelValues::RowCount(const QModelIndex&) const -{ - return !Properties().IsNull() ? Properties()->RowCount() : 0; -} - -// ======================================================================= -// function : Data -// purpose : -// ======================================================================= - -QVariant ViewControl_TableModelValues::Data(const int theRow, - const int theColumn, - int theRole) const -{ - if (!Properties().IsNull()) - { - QVariant aValue = Properties()->Data(theRow, theColumn, theRole); - if (aValue.isValid()) - return aValue; - } - - if (theRole == Qt::TextAlignmentRole) // for multi-lines text, align it to the top - return Qt::AlignTop; - - if ((theRole == Qt::FontRole || theRole == Qt::ForegroundRole) - && isItalicHeader(theRow, theColumn)) - { - if (theRole == Qt::FontRole) - { - QFont aFont = qApp->font(); - aFont.setItalic(true); - return aFont; - } - else - return QColor(Qt::darkGray).darker(150); - } - return QVariant(); -} - -// ======================================================================= -// function : SetData -// purpose : -// ======================================================================= - -bool ViewControl_TableModelValues::SetData(const int theRow, - const int theColumn, - const QVariant& theValue, - int) -{ - if (!Properties().IsNull()) - return Properties()->SetData(theRow, theColumn, theValue); - - return false; -} - -// ======================================================================= -// function : HeaderData -// purpose : -// ======================================================================= - -QVariant ViewControl_TableModelValues::HeaderData(int theSection, - Qt::Orientation theOrientation, - int theRole) const -{ - if (theRole == Qt::DisplayRole) - return myHeaderValues.contains(theOrientation) - ? myHeaderValues[theOrientation][theSection].GetName() - : QString::number(theSection + 1); - else if (theRole == Qt::ForegroundRole) - return QColor(Qt::darkGray); - - return QVariant(); -} - -// ======================================================================= -// function : EditType -// purpose : -// ======================================================================= -ViewControl_EditType ViewControl_TableModelValues::EditType(const int theRow, - const int theColumn) const -{ - if (!Properties().IsNull()) - { - return Properties()->EditType(theRow, theColumn); - } - return ViewControl_EditType_None; -} - -// ======================================================================= -// function : isItalicHeader -// purpose : -// ======================================================================= -Qt::ItemFlags ViewControl_TableModelValues::Flags(const QModelIndex& theIndex) const -{ - if (!Properties().IsNull()) - { - return Properties()->TableFlags(theIndex.row(), theIndex.column()); - } - return theIndex.isValid() ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags; -} - -// ======================================================================= -// function : isItalicHeader -// purpose : -// ======================================================================= -bool ViewControl_TableModelValues::isItalicHeader(const int theRow, const int theColumn) const -{ - Qt::Orientation anOrientation = myOrientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical; - int aCell = anOrientation == Qt::Horizontal ? theColumn : theRow; - - return HeaderItem(anOrientation, aCell).IsItalic(); -} diff --git a/tools/ViewControl/ViewControl_TableModelValues.hxx b/tools/ViewControl/ViewControl_TableModelValues.hxx deleted file mode 100644 index b4d5724d32..0000000000 --- a/tools/ViewControl/ViewControl_TableModelValues.hxx +++ /dev/null @@ -1,180 +0,0 @@ -// Created on: 2020-01-25 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2020 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_TableModelValues_H -#define ViewControl_TableModelValues_H - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -//! \class ViewControl_TableModelValues -//! \brief This is an interface for ViewControl_TableModel to give real values of the model -//! It should be filled or redefined. -class ViewControl_TableModelValues -{ -public: - //! Constructor - ViewControl_TableModelValues(const Qt::Orientation& theOrientation = Qt::Vertical) - { - SetOrientation(theOrientation); - } - - //! Destructor - virtual ~ViewControl_TableModelValues() {} - - //! Returns item table properties builder - const Handle(TreeModel_ItemProperties)& Properties() const { return myProperties; } - - //! Sets item table properties builder - void SetProperties(const Handle(TreeModel_ItemProperties)& theProperties) - { - myProperties = theProperties; - } - - //! Sets direction of the values applying, whether it should be placed by rows or by columns - //! \param theOrientation if horizontal, the values are applied by rows, otherwise by columns - void SetOrientation(const Qt::Orientation& theOrientation) { myOrientation = theOrientation; } - - //! Fills the model header values for orientation. - //! \param theValues a container of header text values - //! \param theOrientation an orientation of header - void SetHeaderValues(const QList& theValues, - const Qt::Orientation theOrientation) - { - myHeaderValues.insert(theOrientation, theValues); - } - - //! Returns whether the column is hidden by default - //! \param theColumnId a column index - //! \return header section values container - TreeModel_HeaderSection HeaderItem(const Qt::Orientation theOrientation, - const int theColumnId) const - { - return myHeaderValues.contains(theOrientation) ? myHeaderValues[theOrientation][theColumnId] - : TreeModel_HeaderSection(); - } - - //! Stores information about table view header visibility - //! \param theOrientation an orientation of header - //! \param theVisibility if true, header is visible - void SetHeaderVisible(const Qt::Orientation theOrientation, const bool theVisibility) - { - myVisibleHeader.insert(theOrientation, theVisibility); - } - - //! Stores information about table view header visibility - //! \param theOrientation an orientation of header - //! \param theVisibility if true, header is visible - bool IsHeaderVisible(const Qt::Orientation theOrientation) const - { - return myVisibleHeader.contains(theOrientation) ? myVisibleHeader[theOrientation] : true; - } - - //! Get default section size if defined - //! \param theOrientation an orientation of header - //! \param theVisibility if true, header is visible - bool DefaultSectionSize(const Qt::Orientation theOrientation, int& theSectionSize) - { - theSectionSize = - myDefaultSectionSize.contains(theOrientation) ? myDefaultSectionSize[theOrientation] : -1; - return myDefaultSectionSize.contains(theOrientation); - } - - //! Set default section size if defined - //! \param theOrientation an orientation of header - //! \param theVisibility if true, header is visible - void SetDefaultSectionSize(const Qt::Orientation theOrientation, const int& theSectionSize) - { - myDefaultSectionSize.insert(theOrientation, theSectionSize); - } - - //! Returns number of columns, size of header values - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int ColumnCount(const QModelIndex& theParent = QModelIndex()) const; - - //! Returns number of rows, depending on orientation: myColumnCount or size of values container - //! \param theParent an index of the parent item - //! \return an integer value - Standard_EXPORT virtual int RowCount(const QModelIndex& theParent = QModelIndex()) const; - - //! Returns content of the model index for the given role, it is obtained from internal container - //! of values It returns value only for DisplayRole. \param theRow a model index row \param - //! theColumn a model index column \param theRole a view role \return value interpreted depending - //! on the given role - Standard_EXPORT virtual QVariant Data(const int theRow, - const int theColumn, - int theRole = Qt::DisplayRole) const; - - //! Sets content of the model index for the given role, it is applied to internal container of - //! values \param theRow a model index row \param theColumn a model index column \param theRole a - //! view role \return true if the value is changed - Standard_EXPORT virtual bool SetData(const int theRow, - const int theColumn, - const QVariant& theValue, - int theRole = Qt::DisplayRole); - - //! Returns content of the model index for the given role, it is obtainer from internal container - //! of header values It returns value only for DisplayRole. \param theSection an index of value in - //! the container \param theIndex a model index \param theRole a view role \return value - //! interpreted depending on the given role - Standard_EXPORT virtual QVariant HeaderData(int theSection, - Qt::Orientation theOrientation, - int theRole = Qt::DisplayRole) const; - - //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable - //! \param theIndex a model index - //! \return flags - Standard_EXPORT virtual Qt::ItemFlags Flags(const QModelIndex& theIndex) const; - - //! Returns type of edit control for the model index. By default, it is an empty control - //! \param theRow a model index row - //! \param theColumn a model index column - //! \return edit type - Standard_EXPORT virtual ViewControl_EditType EditType(const int theRow, - const int theColumn) const; - - //! Returns default color for editable cell - //! \return color value - static QColor EditCellColor() { return QColor(Qt::darkBlue); } - -protected: - //! Returns true if the header item is italic of the parameter index - //! \param theRow a model index row - //! \param theColumn a model index column - //! \param boolean value - bool isItalicHeader(const int theRow, const int theColumn) const; - -protected: - Qt::Orientation myOrientation; //!< orientation how the values should fill the current table view - QMap> myHeaderValues; //!< table header values - QMap myVisibleHeader; //!< table header visibility - QMap myDefaultSectionSize; //!< table section default size - - Handle(TreeModel_ItemProperties) myProperties; //!< item properties -}; - -#endif diff --git a/tools/ViewControl/ViewControl_Tools.cxx b/tools/ViewControl/ViewControl_Tools.cxx deleted file mode 100644 index 90d849753a..0000000000 --- a/tools/ViewControl/ViewControl_Tools.cxx +++ /dev/null @@ -1,153 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// ======================================================================= -// function : CreateAction -// purpose : -// ======================================================================= -QAction* ViewControl_Tools::CreateAction(const QString& theText, - const char* theSlot, - QObject* theParent, - QObject* theContext) -{ - QAction* anAction = new QAction(theText, theParent); - QObject::connect(anAction, SIGNAL(triggered(bool)), theContext, theSlot); - return anAction; -} - -// ======================================================================= -// function : SetWhiteBackground -// purpose : -// ======================================================================= -void ViewControl_Tools::SetWhiteBackground(QWidget* theControl) -{ - QPalette aPalette = theControl->palette(); - aPalette.setColor(QPalette::All, QPalette::Foreground, Qt::white); - theControl->setPalette(aPalette); -} - -// ======================================================================= -// function : SetDefaultHeaderSections -// purpose : -// ======================================================================= -void ViewControl_Tools::SetDefaultHeaderSections(QTableView* theTableView, - const Qt::Orientation theOrientation) -{ - ViewControl_TableModel* aTableModel = - dynamic_cast(theTableView->model()); - ViewControl_TableModelValues* aModelValues = aTableModel->ModelValues(); - if (!aModelValues) - return; - - int aSectionSize; - if (aModelValues->DefaultSectionSize(Qt::Horizontal, aSectionSize)) - theTableView->horizontalHeader()->setDefaultSectionSize(aSectionSize); - else - { - bool isStretchLastSection = true; - for (int aColumnId = 0, aNbColumns = aTableModel->columnCount(); aColumnId < aNbColumns; - aColumnId++) - { - TreeModel_HeaderSection aSection = aModelValues->HeaderItem(theOrientation, aColumnId); - if (aSection.IsEmpty()) - continue; - - int aColumnWidth = aSection.GetWidth(); - if (aColumnWidth > 0) - { - theTableView->setColumnWidth(aColumnId, aColumnWidth); - if (aColumnId == aNbColumns - 1) - isStretchLastSection = false; - } - theTableView->setColumnHidden(aColumnId, aSection.IsHidden()); - } - if (isStretchLastSection != theTableView->horizontalHeader()->stretchLastSection()) - theTableView->horizontalHeader()->setStretchLastSection(isStretchLastSection); - } -} - -// ======================================================================= -// function : CreateTableModelValues -// purpose : -// ======================================================================= -ViewControl_TableModelValues* ViewControl_Tools::CreateTableModelValues( - QItemSelectionModel* theSelectionModel) -{ - ViewControl_TableModelValues* aTableValues = 0; - - QModelIndex anIndex = - TreeModel_ModelBase::SingleSelected(theSelectionModel->selectedIndexes(), 0); - TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex); - if (!anItemBase) - return aTableValues; - - const Handle(TreeModel_ItemProperties)& anItemProperties = anItemBase->Properties(); - if (anItemProperties.IsNull()) - return aTableValues; - - aTableValues = new ViewControl_TableModelValues(); - aTableValues->SetProperties(anItemProperties); - return aTableValues; -} - -// ======================================================================= -// function : ToVariant -// purpose : -// ======================================================================= -QVariant ViewControl_Tools::ToVariant(const Standard_ShortReal theValue) -{ - return QVariant(QLocale().toString(theValue)); -} - -// ======================================================================= -// function : ToVariant -// purpose : -// ======================================================================= -QVariant ViewControl_Tools::ToVariant(const Standard_Real theValue) -{ - return QVariant(QLocale().toString(theValue)); -} - -// ======================================================================= -// function : ToRealValue -// purpose : -// ======================================================================= -Standard_ShortReal ViewControl_Tools::ToShortRealValue(const QVariant& theValue) -{ - return QLocale().toFloat(theValue.toString()); -} - -// ======================================================================= -// function : ToRealValue -// purpose : -// ======================================================================= -Standard_Real ViewControl_Tools::ToRealValue(const QVariant& theValue) -{ - return QLocale().toDouble(theValue.toString()); -} diff --git a/tools/ViewControl/ViewControl_Tools.hxx b/tools/ViewControl/ViewControl_Tools.hxx deleted file mode 100644 index 2271d9c6e7..0000000000 --- a/tools/ViewControl/ViewControl_Tools.hxx +++ /dev/null @@ -1,92 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_Tools_H -#define ViewControl_Tools_H - -#include -#include -#include - -#include -#include -#include -#include - -class ViewControl_TableModelValues; - -class QAction; -class QItemSelectionModel; -class QObject; -class QTableView; -class QWidget; - -//! \class ViewControl_Tools -//! \brief The tool that gives auxiliary methods for qt elements manipulation -class ViewControl_Tools -{ -public: - //! Returns text of separation row in table - //! \return string value - static QString TableSeparator() { return "---------------------------"; } - - //! Creates an action with the given text connected to the slot - //! \param theText an action text value - //! \param theSlot a listener of triggered signal of the new action - //! \param theParent a parent object - //! \param theContext listener of the action toggle - //! \return a new action - Standard_EXPORT static QAction* CreateAction(const QString& theText, - const char* theSlot, - QObject* theParent, - QObject* theContext); - - //! Change palette of the widget to have white foreground - //! \param theControl a widget to be modified - Standard_EXPORT static void SetWhiteBackground(QWidget* theControl); - - //! Fills tree view by default sections parameters obtained in view's table model - //! \param theTableView table view instance - //! \param theOrientation header orientation - Standard_EXPORT static void SetDefaultHeaderSections(QTableView* theTableView, - const Qt::Orientation theOrientation); - - //! Create table of values on the current selection - //! It is created if the selection contains only one item and it has a property item - Standard_EXPORT static ViewControl_TableModelValues* CreateTableModelValues( - QItemSelectionModel* theSelectionModel); - - //! Convert real value to string value - //! \param theValue a short real value - //! \return the string value - Standard_EXPORT static QVariant ToVariant(const Standard_ShortReal theValue); - - //! Convert real value to string value - //! \param theValue a real value - //! \return the string value - Standard_EXPORT static QVariant ToVariant(const Standard_Real theValue); - - //! Convert real value to real value - //! \param theValue a string value - //! \return the real value - Standard_EXPORT static Standard_ShortReal ToShortRealValue(const QVariant& theValue); - - //! Convert real value to string value - //! \param theValue a string value - //! \return the real value - Standard_EXPORT static Standard_Real ToRealValue(const QVariant& theValue); -}; - -#endif diff --git a/tools/ViewControl/ViewControl_TreeView.hxx b/tools/ViewControl/ViewControl_TreeView.hxx deleted file mode 100644 index 668ee44d0a..0000000000 --- a/tools/ViewControl/ViewControl_TreeView.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// Created on: 2017-06-16 -// Created by: Natalia ERMOLAEVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef ViewControl_TreeView_H -#define ViewControl_TreeView_H - -#include - -#include -#include -#include -#include - -class QWidget; - -//! \class ViewControl_TreeView -//! Extended tree view control with possibility to set predefined size. -class ViewControl_TreeView : public QTreeView -{ -public: - //! Constructor - ViewControl_TreeView(QWidget* theParent) - : QTreeView(theParent) - { - } - - //! Destructor - virtual ~ViewControl_TreeView() {} - - //! Sets default size of control, that is used by the first control show - //! \param theDefaultWidth the width value - //! \param theDefaultHeight the height value - void SetPredefinedSize(const QSize& theSize) { myDefaultSize = theSize; } - - //! Returns predefined size if both values are positive, otherwise parent size hint - virtual QSize sizeHint() const Standard_OVERRIDE - { - return myDefaultSize.isValid() ? myDefaultSize : QTreeView::sizeHint(); - } - -private: - QSize myDefaultSize; //!< default size, empty size if it should not be used -}; - -#endif diff --git a/tools/adm/cmake/occt_toolkit_prepare_tool.cmake b/tools/adm/cmake/occt_toolkit_prepare_tool.cmake deleted file mode 100644 index 86e6851fee..0000000000 --- a/tools/adm/cmake/occt_toolkit_prepare_tool.cmake +++ /dev/null @@ -1,5 +0,0 @@ -if ("${TARGET_FOLDER}" STREQUAL "") - set (CMAKE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/..") -endif("${TARGET_FOLDER}" STREQUAL "") - -OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)