mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-03 17:56:21 +03:00
Update empty method guards to new style with regex (see PR). Used clang-format 18.1.8. New actions to validate code formatting is added. Update .clang-format with disabling of include sorting. It is temporary changes, then include will be sorted. Apply formatting for /src and /tools folder. The files with .hxx,.cxx,.lxx,.h,.pxx,.hpp,*.cpp extensions.
1121 lines
42 KiB
C++
1121 lines
42 KiB
C++
// 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 <inspector/DFBrowser_Window.hxx>
|
|
|
|
#include <AIS_InteractiveContext.hxx>
|
|
#include <AIS_InteractiveObject.hxx>
|
|
#include <AIS_ListOfInteractive.hxx>
|
|
|
|
#include <inspector/DFBrowserPane_AttributePaneAPI.hxx>
|
|
|
|
#include <inspector/DFBrowser_AttributePaneStack.hxx>
|
|
#include <inspector/DFBrowser_AttributePaneType.hxx>
|
|
#include <inspector/DFBrowser_DumpView.hxx>
|
|
#include <inspector/DFBrowser_Item.hxx>
|
|
#include <inspector/DFBrowser_ItemApplication.hxx>
|
|
#include <inspector/DFBrowser_Module.hxx>
|
|
#include <inspector/DFBrowser_OpenApplication.hxx>
|
|
#include <inspector/DFBrowser_PropertyPanel.hxx>
|
|
#include <inspector/DFBrowser_SearchLine.hxx>
|
|
#include <inspector/DFBrowser_SearchView.hxx>
|
|
#include <inspector/DFBrowser_Tools.hxx>
|
|
#include <inspector/DFBrowser_TreeLevelLine.hxx>
|
|
#include <inspector/DFBrowser_TreeLevelView.hxx>
|
|
#include <inspector/DFBrowser_TreeModel.hxx>
|
|
|
|
#include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
|
|
#include <inspector/DFBrowserPane_SelectionKind.hxx>
|
|
#include <inspector/DFBrowserPane_Tools.hxx>
|
|
|
|
#include <inspector/TreeModel_ContextMenu.hxx>
|
|
#include <inspector/TreeModel_Tools.hxx>
|
|
|
|
#include <inspector/ViewControl_PropertyView.hxx>
|
|
#include <inspector/ViewControl_TreeView.hxx>
|
|
|
|
#include <OSD_Directory.hxx>
|
|
#include <OSD_Environment.hxx>
|
|
#include <OSD_Protection.hxx>
|
|
|
|
#include <inspector/View_Displayer.hxx>
|
|
#include <inspector/View_ToolBar.hxx>
|
|
#include <inspector/View_Viewer.hxx>
|
|
#include <inspector/View_Window.hxx>
|
|
|
|
#include <TDF_Tool.hxx>
|
|
#include <inspector/ViewControl_MessageDialog.hxx>
|
|
#include <inspector/ViewControl_Tools.hxx>
|
|
|
|
#include <Standard_WarningsDisable.hxx>
|
|
#include <QAction>
|
|
#include <QApplication>
|
|
#include <QComboBox>
|
|
#include <QDir>
|
|
#include <QDockWidget>
|
|
#include <QGridLayout>
|
|
#include <QList>
|
|
#include <QMainWindow>
|
|
#include <QItemSelectionModel>
|
|
#include <QPushButton>
|
|
#include <QTabWidget>
|
|
#include <QToolBar>
|
|
#include <QTreeView>
|
|
#include <QMenu>
|
|
#include <QMessageBox>
|
|
#include <QStatusBar>
|
|
#include <QWidget>
|
|
#if QT_VERSION < 0x050000
|
|
#include <QWindowsStyle>
|
|
#else
|
|
#include <QStyleFactory>
|
|
#endif
|
|
#include <Standard_WarningsRestore.hxx>
|
|
|
|
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<QDockWidget*> aDockwidgets = myMainWindow->findChildren<QDockWidget*>();
|
|
for (QList<QDockWidget*>::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<QString, QString> anItems;
|
|
TreeModel_Tools::SaveState(myTreeView, anItems);
|
|
View_Window::SaveState(myViewWindow, anItems);
|
|
|
|
for (QMap<QString, QString>::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<Handle(Standard_Transient)>());
|
|
|
|
if (myParameters->FindFileNames(aName))
|
|
{
|
|
NCollection_List<TCollection_AsciiString> aFileNames = myParameters->FileNames(aName);
|
|
if (aFileNames.Extent() > 0) // only one document file might be opened
|
|
OpenFile(aFileNames.First());
|
|
myParameters->SetFileNames(aName, NCollection_List<TCollection_AsciiString>());
|
|
}
|
|
onUpdateClicked();
|
|
|
|
// make parameter items selected if defined
|
|
if (myParameters->FindSelectedNames(aName))
|
|
{
|
|
const NCollection_List<TCollection_AsciiString>& aSelected =
|
|
myParameters->GetSelectedNames(aName);
|
|
|
|
DFBrowser_TreeModel* aTreeModel = dynamic_cast<DFBrowser_TreeModel*>(myTreeView->model());
|
|
Handle(TDocStd_Application) anApplication = aTreeModel->GetTDocStdApplication();
|
|
|
|
QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
|
|
aSelectionModel->clear();
|
|
|
|
NCollection_List<TCollection_AsciiString>::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<DFBrowser_Item> (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<DFBrowser_Item>(anItemBase);
|
|
if (anItem->HasAttribute())
|
|
{
|
|
// processing attribute in theValue
|
|
DFBrowser_ItemApplicationPtr aRootAppItem =
|
|
itemDynamicCast<DFBrowser_ItemApplication>(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<TCollection_AsciiString>());
|
|
}
|
|
}
|
|
|
|
// =======================================================================
|
|
// function : Init
|
|
// purpose :
|
|
// =======================================================================
|
|
void DFBrowser_Window::Init(const NCollection_List<Handle(Standard_Transient)>& theParameters)
|
|
{
|
|
Handle(TDocStd_Application) anApplication;
|
|
if (myModule)
|
|
{
|
|
DFBrowser_TreeModel* anOCAFViewModel =
|
|
dynamic_cast<DFBrowser_TreeModel*>(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<Handle(Standard_Transient)>::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<DFBrowser_TreeModel*>(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<DFBrowser_TreeModel*>(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<Handle(Standard_Transient)> aParameters;
|
|
if (myParameters->FindParameters(aPluginName))
|
|
aParameters = myParameters->Parameters(aPluginName);
|
|
|
|
NCollection_List<TCollection_AsciiString> 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<TDF_Label> aReferences;
|
|
Handle(Standard_Transient) aPresentation;
|
|
anAttributePane->GetReferences(anAttribute, aReferences, aPresentation);
|
|
QModelIndexList anIndices;
|
|
DFBrowser_TreeModel* aTreeModel = dynamic_cast<DFBrowser_TreeModel*>(myTreeView->model());
|
|
if (!aReferences.IsEmpty())
|
|
aTreeModel->ConvertToIndices(aReferences, anIndices);
|
|
else
|
|
{
|
|
NCollection_List<Handle(TDF_Attribute)> 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<DFBrowser_TreeModel*>(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<DFBrowser_TreeModel*>(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<DFBrowser_TreeModel*>(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);
|
|
}
|