// 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 #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); myThread = new DFBrowser_Thread (this); } // ======================================================================= // 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*/); myThread->ProcessApplication(); myModule->SetInitialTreeViewSelection(); } // ======================================================================= // function : OpenFile // purpose : // ======================================================================= void DFBrowser_Window::OpenFile (const TCollection_AsciiString& theFileName) { QApplication::setOverrideCursor (Qt::WaitCursor); myThread->TerminateThread(); myTreeLevelLine->ClearHistory(); QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel(); if (aSelectionModel) { aSelectionModel->clearSelection(); QModelIndex anIndex; aSelectionModel->select (anIndex, QItemSelectionModel::ClearAndSelect); } ClearThreadCache(); 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*/); myThread->ProcessApplication(); 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(); ClearThreadCache(); myThread->ProcessApplication(); } // ======================================================================= // function : ClearThreadCache // purpose : // ======================================================================= void DFBrowser_Window::ClearThreadCache() { DFBrowser_ThreadItemSearch::ClearValues (GetTreeLevelLine()->GetSearchLine()); } // ======================================================================= // 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); }