1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-04 18:06:22 +03:00
occt/tools/TInspector/TInspector_Window.cxx
nds 7e1c1e4869 0030268: Inspectors - improvements in VInspector plugin
- Convert package creation. It is used to prepare some auxiliary presentations/methods to prepare variables for inspector based on occt classes.
- ViewControl package improvement:
  Classes for property view, table, table model are implemented to visualize view of properties.
  This view is filled by selection in tree if the selected object has implemented DumpJson functionality.
- TreeModel package improvements:
  Method InitColumn is implemented in TreeModel_TreeModel to fill default columns in base model. The default columns are:
    Name, Visibility, Rows. Additional columns should be added in successors.
  Container of root items is moved into the base class
- View package imrovements:
  Store preferences: display mode, fit all checked state and type of external context
  View_DisplayPreview is added to process preview for selected in tree view objects
  hide actions Clear, Multi, Single by default (as selection in tree view or Visibility state of item define which presentations should be displayed or erased)
- ShapeView plugin improvements:
  Property View content based on DumpJson (columns in tree view for properties are removed),
  Properties for TopoDS_Shape are displayed
  Explode shape action in tree view to see content of shape by selected shape type. Type of displayed shapes is only preview, it is not used in export action.
  Export shape into BREP. The previous implementation about BREP files in some directory and default view is removed.
- VInspector plugin imrovements:
  Property View content based on DumpJson (columns in tree view for properties are removed),
  Properties for AIS_InteractiveContext and AIS_InteractiveObject are displayed
  obsolete classes to provide properties are removed.
- DFBrowser plugin improvements:
  Property View content based on DumpJson is not used yet. But there is the USE_DUMPJSON macro. It's switch off by default.
  If switch ON, it creates a Property View filled with DumpJson. It's a way of DFBrowser moving on this property view.
  Init uses static variable CDF_Session::CurrentSession()->CurrentApplication to fill plugin if application in plugin is not set but OCAF application exists

- OCC_VERSION_HEX variable used for previous OCCT versions support (before 6.9.0 or 7.2.0) is removed
2020-02-12 18:00:36 +03:00

592 lines
20 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/TInspector_Window.hxx>
#include <inspector/TInspectorAPI_Communicator.hxx>
#include <inspector/TInspector_PluginParameters.hxx>
#include <inspector/TInspector_Shortcut.hxx>
#include <inspector/TreeModel_Tools.hxx>
#include <inspector/ViewControl_Tools.hxx>
#include <OSD_Directory.hxx>
#include <OSD_Environment.hxx>
#include <OSD_Path.hxx>
#include <OSD_Protection.hxx>
#include <Standard_WarningsDisable.hxx>
#include <QApplication>
#include <QButtonGroup>
#include <QDockWidget>
#include <QLabel>
#include <QMainWindow>
#include <QMenu>
#include <QPushButton>
#include <QStackedWidget>
#include <QToolButton>
#include <QVBoxLayout>
#include <Standard_WarningsRestore.hxx>
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<TCollection_AsciiString> TInspector_Window::RegisteredPlugins() const
{
NCollection_List<TCollection_AsciiString> 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<Handle(Standard_Transient)>& 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<Handle(Standard_Transient)> aParameters;
if (myParameters->FindParameters (thePluginName))
aParameters = myParameters->Parameters (thePluginName);
for (NCollection_List<Handle(Standard_Transient)>::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<TCollection_AsciiString>& 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<Handle(Standard_Transient)>& 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;
}