1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0031362: Inspectors - MessageView plugin for message alerts

- OSD_Timer in message alert,
- DumpJson correction,
- Selection owner should be dumped in selector. Sensitive entities might be used in the same owner, that leads to lots of the same dump in the result stream.

(cherry picked from commit e8bde810616e61cbe925981176681f2840234fa4)
This commit is contained in:
nds
2020-10-27 19:24:59 +03:00
parent 50013cf4a3
commit a463065302
44 changed files with 478 additions and 129 deletions

View File

@@ -27,9 +27,9 @@ static Handle(Message_Messenger) MyMessenger;
namespace
{
static Standard_CString Message_Table_PrintMetricTypeEnum[10] =
static Standard_CString Message_Table_PrintMetricTypeEnum[11] =
{
"NONE", "UserTimeCPU", "SystemTimeInfo", "MemPrivate", "MemVirtual",
"NONE", "UserTimeCPU", "SystemTimeCPU", "WallClock", "MemPrivate", "MemVirtual",
"MemWorkingSet", "MemWorkingSetPeak", "MemSwapUsage", "MemSwapUsagePeak", "MemHeapUsage"
};
}

View File

@@ -14,6 +14,7 @@
// commercial license or contractual agreement.
#include <Message_Alert.hxx>
#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_Alert,Standard_Transient)
@@ -48,3 +49,12 @@ Standard_Boolean Message_Alert::Merge (const Handle(Message_Alert)& /*theTarget*
// by default, merge trivially
return Standard_True;
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_Alert::DumpJson (Standard_OStream& theOStream, Standard_Integer) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
}

View File

@@ -54,6 +54,9 @@ public:
//! Base implementation always returns true.
virtual Standard_EXPORT Standard_Boolean Merge (const Handle(Message_Alert)& theTarget);
//! Dumps the content of me into the stream
virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
DEFINE_STANDARD_RTTIEXT(Message_Alert,Standard_Transient)
};

View File

@@ -18,6 +18,7 @@
#include <Precision.hxx>
#include <Standard_Assert.hxx>
#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_AlertExtended,Message_Alert)
@@ -89,3 +90,22 @@ Handle(Message_Alert) Message_AlertExtended::AddAlert (const Handle(Message_Repo
return anAlert;
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_AlertExtended::DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
if (!myCompositAlerts.IsNull())
{
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCompositAlerts.get())
}
if (!myAttribute.IsNull())
{
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAttribute.get())
}
}

View File

@@ -78,6 +78,10 @@ public:
const Handle(Message_Attribute)& theAttribute,
const Message_Gravity theGravity);
//! Dumps the content of me into the stream
virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth = -1) const Standard_OVERRIDE;
DEFINE_STANDARD_RTTIEXT(Message_AlertExtended, Message_Alert)
protected:

View File

@@ -14,6 +14,7 @@
#include <Message_Attribute.hxx>
#include <Standard_Assert.hxx>
#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient)
@@ -26,3 +27,13 @@ Standard_CString Message_Attribute::GetMessageKey () const
{
return !myName.IsEmpty() ? myName.ToCString() : "";
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_Attribute::DumpJson (Standard_OStream& theOStream, Standard_Integer) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName)
}

View File

@@ -43,6 +43,9 @@ public:
//! @param theName a name for the alert
void SetName (const TCollection_AsciiString& theName) { myName = theName; }
//! Dumps the content of me into the stream
virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
DEFINE_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient)
private:

View File

@@ -16,8 +16,10 @@
#include <Message.hxx>
#include <Message_Report.hxx>
#include <OSD_Chronometer.hxx>
#include <OSD_Timer.hxx>
#include <Precision.hxx>
#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute)
@@ -121,6 +123,16 @@ void Message_AttributeMeter::SetAlertMetrics (const Handle(Message_AlertExtended
const NCollection_Map<Message_MetricType>& anActiveMetrics = aReport->ActiveMetrics();
// time metrics
if (anActiveMetrics.Contains (Message_MetricType_WallClock))
{
OSD_Timer aTimer;
aTimer.Start();
Standard_Real aTime = aTimer.StartTime();
if (theStartValue)
aMeterAttribute->SetStartValue (Message_MetricType_WallClock, aTime);
else
aMeterAttribute->SetStopValue (Message_MetricType_WallClock, aTime);
}
if (anActiveMetrics.Contains (Message_MetricType_UserTimeCPU) ||
anActiveMetrics.Contains (Message_MetricType_SystemTimeInfo))
{
@@ -173,3 +185,21 @@ void Message_AttributeMeter::SetAlertMetrics (const Handle(Message_AlertExtended
aMeterAttribute->SetStopValue (aMetricType, (Standard_Real)aMemInfo.ValuePreciseMiB (anIterator.Value()));
}
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_AttributeMeter::DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute)
for (NCollection_DataMap<Message_MetricType, StartToStopValue>::Iterator anIterator (myMetrics);
anIterator.More(); anIterator.Next())
{
OCCT_DUMP_VECTOR_CLASS (theOStream, Message::MetricToString (anIterator.Key()),
2, anIterator.Value().first, anIterator.Value().second)
}
}

View File

@@ -80,6 +80,10 @@ public:
static Standard_EXPORT void SetAlertMetrics (const Handle(Message_AlertExtended)& theAlert,
const Standard_Boolean theStartValue);
//! Dumps the content of me into the stream
virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth = -1) const Standard_OVERRIDE;
DEFINE_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute)
private:

View File

@@ -15,6 +15,7 @@
#define _Message_AttributeObject_HeaderFile
#include <Message_Attribute.hxx>
#include <Standard_Dump.hxx>
class Standard_Transient;
@@ -35,6 +36,15 @@ public:
//! @param theObject an instance
void SetObject (const Handle(Standard_Transient)& theObject) { myObject = theObject; }
//! Dumps the content of me into the stream
virtual void DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth = -1) const Standard_OVERRIDE
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute)
OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myObject.get())
}
DEFINE_STANDARD_RTTI_INLINE(Message_AttributeObject, Message_Attribute)
private:

View File

@@ -12,6 +12,7 @@
// commercial license or contractual agreement.
#include <Message_AttributeStream.hxx>
#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute)
@@ -39,3 +40,15 @@ void Message_AttributeStream::SetStream (const Standard_SStream& theStream)
myStream << aStreamStr;
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_AttributeStream::DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute)
OCCT_DUMP_STREAM_VALUE_DUMPED (theOStream, myStream)
}

View File

@@ -34,6 +34,10 @@ public:
//! Sets stream value
Standard_EXPORT void SetStream (const Standard_SStream& theStream);
//! Dumps the content of me into the stream
virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth = -1) const Standard_OVERRIDE;
DEFINE_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute)
private:

View File

@@ -14,6 +14,7 @@
#include <Message_CompositeAlerts.hxx>
#include <Message_AlertExtended.hxx>
#include <Standard_Assert.hxx>
#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_CompositeAlerts, Standard_Transient)
@@ -153,3 +154,29 @@ void Message_CompositeAlerts::Clear (const Handle(Standard_Type)& theType)
}
}
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_CompositeAlerts::DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i)
{
if (myAlerts[i].IsEmpty())
continue;
Message_Gravity aGravity = (Message_Gravity)i;
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aGravity)
Standard_Integer anInc = 1;
for (Message_ListOfAlert::Iterator anIt (myAlerts[i]); anIt.More(); anIt.Next(), anInc++)
{
const Handle(Message_Alert)& anAlert = anIt.Value();
OCCT_DUMP_FIELD_VALUES_DUMPED_INC (theOStream, theDepth, anAlert.get(), anInc)
}
}
}

View File

@@ -66,6 +66,9 @@ public:
//! @param theType an alert type
Standard_EXPORT void Clear (const Handle(Standard_Type)& theType);
//! Dumps the content of me into the stream
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
DEFINE_STANDARD_RTTIEXT(Message_CompositeAlerts,Standard_Transient)
protected:

View File

@@ -20,6 +20,7 @@ enum Message_MetricType
Message_MetricType_None, //!< no computation
Message_MetricType_UserTimeCPU, //!< the current CPU user time in seconds
Message_MetricType_SystemTimeInfo, //!< the current CPU system time in seconds
Message_MetricType_WallClock, //!< OSD_Timer elapsed time
Message_MetricType_MemPrivate, //!< OSD_MemInfo::MemPrivate
Message_MetricType_MemVirtual, //!< OSD_MemInfo::MemVirtual
Message_MetricType_MemWorkingSet, //!< OSD_MemInfo::MemWorkingSet

View File

@@ -28,6 +28,18 @@
IMPLEMENT_STANDARD_RTTIEXT(Message_PrinterToReport, Message_Printer)
//=======================================================================
//function : Destructor
//purpose :
//=======================================================================
Message_PrinterToReport::~Message_PrinterToReport()
{
if (!myReport.IsNull())
{
myReport->UpdateActiveInMessenger();
}
}
//=======================================================================
//function : Report
//purpose :
@@ -40,6 +52,16 @@ const Handle(Message_Report)& Message_PrinterToReport::Report() const
return Message::DefaultReport (Standard_True);
}
//=======================================================================
//function : Send
//purpose :
//=======================================================================
void Message_PrinterToReport::SetReport (const Handle(Message_Report)& theReport)
{
myReport = theReport;
myReport->UpdateActiveInMessenger();
}
//=======================================================================
//function : Send
//purpose :

View File

@@ -35,14 +35,15 @@ public:
//! Create printer for redirecting messages into report.
Message_PrinterToReport() {}
~Message_PrinterToReport() {}
//! Destructor
Standard_EXPORT ~Message_PrinterToReport();
//! Returns the current or default report
Standard_EXPORT const Handle(Message_Report)& Report() const;
//! Sets the printer report
//! @param theReport report for messages processing, if NULL, the default report is used
Standard_EXPORT void SetReport (const Handle(Message_Report)& theReport) { myReport = theReport; }
Standard_EXPORT void SetReport (const Handle(Message_Report)& theReport);
//! Send a string message with specified trace level.
//! Stream is converted to string value.

View File

@@ -37,7 +37,8 @@ IMPLEMENT_STANDARD_RTTIEXT(Message_Report,Standard_Transient)
//=======================================================================
Message_Report::Message_Report ()
: myLimit (-1), myWriteFileOnEachAlert (Standard_False)
: myLimit (-1), myWriteFileOnEachAlert (Standard_False),
myIsActiveInMessenger (Standard_False)
{
}
@@ -121,16 +122,9 @@ Standard_Boolean Message_Report::HasAlert (const Handle(Standard_Type)& theType,
//purpose :
//=======================================================================
Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messenger)& theMessenger) const
Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messenger)&) const
{
Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger;
for (Message_SequenceOfPrinters::Iterator anIterator (aMessenger->Printers()); anIterator.More(); anIterator.Next())
{
if (anIterator.Value()->IsKind(STANDARD_TYPE (Message_PrinterToReport)) &&
Handle(Message_PrinterToReport)::DownCast (anIterator.Value())->Report() == this)
return Standard_True;
}
return Standard_False;
return myIsActiveInMessenger;
}
//=======================================================================
@@ -139,11 +133,12 @@ Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messe
//=======================================================================
void Message_Report::ActivateInMessenger (const Standard_Boolean toActivate,
const Handle(Message_Messenger)& theMessenger) const
const Handle(Message_Messenger)& theMessenger)
{
if (toActivate == IsActiveInMessenger())
return;
myIsActiveInMessenger = toActivate;
Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger;
if (toActivate)
{
@@ -168,6 +163,25 @@ void Message_Report::ActivateInMessenger (const Standard_Boolean toActivate,
}
}
//=======================================================================
//function : UpdateActiveInMessenger
//purpose :
//=======================================================================
void Message_Report::UpdateActiveInMessenger (const Handle(Message_Messenger)& theMessenger)
{
Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger;
for (Message_SequenceOfPrinters::Iterator anIterator (aMessenger->Printers()); anIterator.More(); anIterator.Next())
{
if (anIterator.Value()->IsKind(STANDARD_TYPE (Message_PrinterToReport)) &&
Handle(Message_PrinterToReport)::DownCast (anIterator.Value())->Report() == this)
{
myIsActiveInMessenger = Standard_True;
return;
}
}
myIsActiveInMessenger = Standard_False;
}
//=======================================================================
//function : AddLevel
//purpose :
@@ -447,3 +461,29 @@ void Message_Report::writeReport()
myReportWriter->ExportReport (this);
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void Message_Report::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
if (!myCompositAlerts.IsNull())
{
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCompositAlerts.get())
}
Standard_Integer anAlertLevels = myAlertLevels.Size();
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, anAlertLevels)
for (NCollection_Map<Message_MetricType>::Iterator anIterator (myActiveMetrics); anIterator.More(); anIterator.Next())
{
Message_MetricType anActiveMetric = anIterator.Value();
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, anActiveMetric)
}
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLimit)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsActiveInMessenger)
}

View File

@@ -82,8 +82,13 @@ public:
//! Creates an instance of Message_PrinterToReport with the current report and register it in messenger
//! @param toActivate if true, activated else deactivated
// @param theMessenger the messenger. If it's NULL, the default messenger is used
Standard_EXPORT void ActivateInMessenger (const Standard_Boolean toActivate, const Handle(Message_Messenger)& theMessenger = NULL) const;
Standard_EXPORT void ActivateInMessenger (const Standard_Boolean toActivate, const Handle(Message_Messenger)& theMessenger = NULL);
//! Updates internal flag IsActiveInMessenger.
//! It becomes true if messenger contains at least one instance of Message_PrinterToReport.
//! @param theMessenger the messenger. If it's NULL, the default messenger is used
Standard_EXPORT void UpdateActiveInMessenger (const Handle(Message_Messenger)& theMessenger = NULL);
//! Add new level of alerts
//! @param theLevel a level
Standard_EXPORT void AddLevel (Message_Level* theLevel, const TCollection_AsciiString& theName);
@@ -153,6 +158,9 @@ public:
//! Merges alerts with specified gravity from theOther report into this
Standard_EXPORT void Merge (const Handle(Message_Report)& theOther, Message_Gravity theGravity);
//! Dumps the content of me into the stream
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
DEFINE_STANDARD_RTTIEXT(Message_Report,Standard_Transient)
protected:
@@ -183,6 +191,7 @@ protected:
Standard_Integer myLimit; //! Maximum number of collected alerts on the top level
Standard_Boolean myWriteFileOnEachAlert; //! State if output file should be written on each alert adding
Standard_Boolean myIsActiveInMessenger; //! state whether the report is activated in messenger
};
#endif // _Message_Report_HeaderFile

View File

@@ -79,6 +79,9 @@ public:
//! the Timer.
Standard_EXPORT virtual void Start() Standard_OVERRIDE;
//! Returns start time in seconds.
Standard_Real StartTime() const { return myTimeStart; }
//! Returns elapsed time in seconds.
Standard_EXPORT Standard_Real ElapsedTime() const;

View File

@@ -39,7 +39,7 @@ void Select3D_SensitiveEntity::DumpJson (Standard_OStream& theOStream, Standard_
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myOwnerId.get())
OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myOwnerId.get())
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySFactor)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbSubElements());

View File

@@ -124,6 +124,27 @@ void SelectMgr_Selection::DumpJson (Standard_OStream& theOStream, Standard_Integ
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
NCollection_IndexedMap<Handle(SelectMgr_EntityOwner)> anOwners;
for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next())
{
const Handle(SelectMgr_SensitiveEntity)& anEntity = anIterator.Value();
if (anEntity.IsNull() || anEntity->BaseSensitive().IsNull())
{
continue;
}
const Handle(SelectMgr_EntityOwner)& anOwner = anEntity->BaseSensitive()->OwnerId();
if (!anOwners.Contains (anOwner))
{
anOwners.Add (anOwner);
}
}
for (NCollection_IndexedMap<Handle(SelectMgr_EntityOwner)>::Iterator anIterator (anOwners); anIterator.More(); anIterator.Next())
{
const Handle(SelectMgr_EntityOwner)& anOwner = anIterator.Value();
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anOwner.get())
}
for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next())
{
const Handle(SelectMgr_SensitiveEntity)& anEntity = anIterator.Value();

View File

@@ -24,7 +24,7 @@ void Standard_Dump::AddValuesSeparator (Standard_OStream& theOStream)
Standard_SStream aStream;
aStream << theOStream.rdbuf();
TCollection_AsciiString aStreamStr = Standard_Dump::Text (aStream);
if (!aStreamStr.IsEmpty() && !aStreamStr.EndsWith ("{"))
if (!aStreamStr.IsEmpty() && !aStreamStr.EndsWith ("{") && !aStreamStr.EndsWith (", "))
theOStream << ", ";
}
@@ -306,9 +306,15 @@ TCollection_AsciiString Standard_Dump::FormatJson (const Standard_SStream& theSt
Standard_Integer anIndentCount = 0;
Standard_Boolean isMassiveValues = Standard_False;
for (Standard_Integer anIndex = 1; anIndex < aStreamStr.Length(); anIndex++)
for (Standard_Integer anIndex = 1; anIndex <= aStreamStr.Length(); anIndex++)
{
Standard_Character aSymbol = aStreamStr.Value (anIndex);
if (anIndex == 1 && aText.IsEmpty() && aSymbol != '{')
{
// append opening brace for json start
aSymbol = '{';
anIndex--;
}
if (aSymbol == '{')
{
anIndentCount++;
@@ -354,6 +360,18 @@ TCollection_AsciiString Standard_Dump::FormatJson (const Standard_SStream& theSt
}
else
aText += aSymbol;
if (anIndex == aStreamStr.Length() && aSymbol != '}')
{
// append closing brace for json end
aSymbol = '}';
anIndentCount--;
aText += '\n';
for (int anIndent = 0; anIndent < anIndentCount; anIndent++)
aText += anIndentStr;
aText += aSymbol;
}
}
return aText;
}

View File

@@ -155,6 +155,35 @@
} \
}
//! @def OCCT_DUMP_FIELD_VALUES_DUMPED
//! Append into output value: "Name": { field dumped values }
//! It computes Dump of the fields. The expected field is a pointer.
//! Use this macro for fields of the dumped class which has own Dump implementation.
//! The macros is recursive. Recursion is stopped when the depth value becomes equal to zero.
//! Depth = -1 is the default value, dump here is unlimited.
#define OCCT_DUMP_FIELD_VALUES_DUMPED_INC(theOStream, theDepth, theField, theIncName) \
{ \
if (theDepth != 0 && (void*)(theField) != NULL) \
{ \
Standard_SStream aFieldStream; \
(theField)->DumpJson (aFieldStream, theDepth - 1); \
TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField) + theIncName; \
Standard_Dump::DumpKeyToClass (theOStream, aName, Standard_Dump::Text (aFieldStream)); \
} \
}
//! @def OCCT_DUMP_FIELD_VALUES_DUMPED
//! Append into output value: "Name": { field dumped values }
//! It computes Dump of the fields. The expected field is a pointer.
//! Use this macro for fields of the dumped class which has own Dump implementation.
//! The macros is recursive. Recursion is stopped when the depth value becomes equal to zero.
//! Depth = -1 is the default value, dump here is unlimited.
#define OCCT_DUMP_STREAM_VALUE_DUMPED(theOStream, theField) \
{ \
TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \
Standard_Dump::DumpKeyToClass (theOStream, aName, Standard_Dump::Text (theField)); \
}
//! @def OCCT_INIT_FIELD_VALUES_DUMPED
//! Append into output value: "Name": { field dumped values }
//! It computes Dump of the fields. The expected field is a pointer.
@@ -267,6 +296,7 @@ public:
//! - for '{' append after '\n' and indent to the next value, increment current indent value
//! - for '}' append '\n' and current indent before it, decrement indent value
//! - for ',' append after '\n' and indent to the next value. If the current symbol is in massive container [], do nothing
//! Covers result with opened and closed brackets on the top level, if it has no symbols there.
//! @param theStream source value
//! @param theIndent count of ' ' symbols to apply hierarchical indent of the text values
//! @return text presentation

View File

@@ -53,3 +53,16 @@ void TopoDS_AlertAttribute::Send (const Handle(Message_Messenger)& theMessenger,
// Message_Info);
}
}
//=======================================================================
//function : DumpJson
//purpose :
//=======================================================================
void TopoDS_AlertAttribute::DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth) const
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute)
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myShape)
}

View File

@@ -40,6 +40,10 @@ public:
Standard_EXPORT static void Send (const Handle(Message_Messenger)& theMessenger,
const TopoDS_Shape& theShape);
//! Dumps the content of me into the stream
Standard_EXPORT void DumpJson (Standard_OStream& theOStream,
Standard_Integer theDepth = -1) const Standard_OVERRIDE;
// OCCT RTTI
DEFINE_STANDARD_RTTIEXT(TopoDS_AlertAttribute, Message_AttributeStream)

View File

@@ -49,7 +49,7 @@ DFBrowser_TreeModel::DFBrowser_TreeModel (QObject* theParent)
// =======================================================================
void DFBrowser_TreeModel::InitColumns()
{
SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
setHeaderItem (0, TreeModel_HeaderSection ("Name"));
}
// =======================================================================

View File

@@ -37,7 +37,7 @@ DFBrowserPane_TDataStdTreeNodeModel::DFBrowserPane_TDataStdTreeNodeModel (QObjec
// =======================================================================
void DFBrowserPane_TDataStdTreeNodeModel::InitColumns()
{
SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
setHeaderItem (0, TreeModel_HeaderSection ("Name"));
}
// =======================================================================

View File

@@ -170,6 +170,7 @@ void MessageModel_Actions::OnActivateReport()
Message::DefaultMessenger()->AddPrinter (MyPrinterToReport);
Message::DefaultMessenger()->SetTraceLevel (1);
Message::DefaultReport()->UpdateActiveInMessenger();
myTreeModel->UpdateTreeModel();
}

View File

@@ -119,8 +119,12 @@ QVariant MessageModel_ItemAlert::initValue (const int theRole) const
if (anAttribute.IsNull() || !anAttribute->HasMetric (aMetricType))
return QVariant();
if (!anAttribute->IsMetricValid (aMetricType))
return QVariant ("in process");
if (aMetricType == Message_MetricType_UserTimeCPU ||
aMetricType == Message_MetricType_SystemTimeInfo)
aMetricType == Message_MetricType_SystemTimeInfo ||
aMetricType == Message_MetricType_WallClock)
{
Standard_Real aCumulativeMetric = anAttribute->StopValue (aMetricType) - anAttribute->StartValue (aMetricType);
if (fabs (aCumulativeMetric) < Precision::Confusion())

View File

@@ -67,7 +67,8 @@ QVariant MessageModel_ItemReport::initValue (const int theRole) const
Message_MetricType aMetricType;
int aPosition;
if (MessageModel_TreeModel::IsMetricColumn (Column(), aMetricType, aPosition) &&
(aMetricType == Message_MetricType_UserTimeCPU || aMetricType == Message_MetricType_SystemTimeInfo))
(aMetricType == Message_MetricType_UserTimeCPU || aMetricType == Message_MetricType_SystemTimeInfo ||
aMetricType == Message_MetricType_WallClock))
{
if (aPosition == 0) return CumulativeMetric (aReport, aMetricType);
else if (aPosition == 1) return "100";
@@ -210,8 +211,9 @@ Standard_Real MessageModel_ItemReport::CumulativeMetric (const Handle(Message_Re
if (anAlert.IsNull())
continue;
Handle(Message_AttributeMeter) anAttribute = Handle(Message_AttributeMeter)::DownCast (anAlert->Attribute());
if (anAttribute.IsNull() || !anAttribute->HasMetric(theMetricType))
if (anAttribute.IsNull() || !anAttribute->HasMetric (theMetricType) || !anAttribute->IsMetricValid (theMetricType))
continue;
//if (aFirstAttribute.IsNull())
// aFirstAttribute = anAttribute;
//else

View File

@@ -22,7 +22,7 @@
#include <Message.hxx>
const int COLUMN_NAME_WIDTH = 460;
const int COLUMN_NAME_WIDTH = 230;
const int COLUMN_SIZE_WIDTH = 30;
const int COLUMN_REAL_VALUE_WIDTH = 115;
@@ -44,9 +44,9 @@ MessageModel_TreeModel::MessageModel_TreeModel (QObject* theParent)
void MessageModel_TreeModel::InitColumns()
{
// 0 - Name, 1 - visibility, 2 - Row
SetHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
SetHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth()));
SetHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH, Standard_True /*hidden*/));
setHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
setHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth()));
setHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH, Standard_True /*hidden*/));
int aNextIndex = 3;
for (int aMetricId = (int)Message_MetricType_None + 1; aMetricId <= (int)Message_MetricType_MemHeapUsage; aMetricId++)
@@ -55,10 +55,10 @@ void MessageModel_TreeModel::InitColumns()
OSD_MemInfo::Counter aMemInfo;
bool isMemInfo = Message::ToOSDMetric (aMetricType, aMemInfo);
SetHeaderItem (aNextIndex++,
setHeaderItem (aNextIndex++,
TreeModel_HeaderSection (QString("%1 [%2]").arg (Message::MetricToString (aMetricType)).arg(isMemInfo ? "Mb" : "s"),
COLUMN_REAL_VALUE_WIDTH));
SetHeaderItem (aNextIndex++, TreeModel_HeaderSection (isMemInfo ? "Delta" : "%", COLUMN_PERCENT_VALUE_WIDTH));
setHeaderItem (aNextIndex++, TreeModel_HeaderSection (isMemInfo ? "Delta" : "%", COLUMN_PERCENT_VALUE_WIDTH));
}
}

View File

@@ -80,7 +80,7 @@
#include <QWidget>
#include <QVBoxLayout>
const int DEFAULT_TEXT_VIEW_WIDTH = 400;// 800;
const int DEFAULT_TEXT_VIEW_WIDTH = 800;// 800;
const int DEFAULT_TEXT_VIEW_HEIGHT = 700;
const int DEFAULT_TEXT_VIEW_POSITION_X = 430;
const int DEFAULT_TEXT_VIEW_POSITION_Y = 30;
@@ -149,6 +149,9 @@ MessageView_Window::MessageView_Window (QWidget* theParent)
aModel->InitColumns();
//aModel->SetReversed (Standard_True);
connect (myTreeView->header(), SIGNAL (sectionResized (int, int, int)),
this, SLOT(onHeaderResized (int, int, int)));
myTreeView->setModel (aModel);
MessageView_VisibilityState* aVisibilityState = new MessageView_VisibilityState (aModel);
aModel->SetVisibilityState (aVisibilityState);
@@ -171,6 +174,9 @@ MessageView_Window::MessageView_Window (QWidget* theParent)
this, SLOT (onTreeViewContextMenuRequested (const QPoint&)));
//new TreeModel_ContextMenu (myTreeView);
connect (myTreeView->header(), SIGNAL (sectionResized (int, int, int)),
this, SLOT(onHeaderResized (int, int, int)));
QModelIndex aParentIndex = myTreeView->model()->index (0, 0);
myTreeView->setExpanded (aParentIndex, true);
@@ -251,15 +257,18 @@ void MessageView_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theIt
theItem.Bind ("geometry", TreeModel_Tools::ToString (myMainWindow->saveState()).toStdString().c_str());
QMap<QString, QString> anItems;
//TreeModel_Tools::SaveState (myTreeView, anItems);
TreeModel_Tools::SaveState (myTreeView, 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());
}
anItems.clear();
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());
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());
}
}
// =======================================================================
@@ -272,8 +281,8 @@ void MessageView_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap&
{
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 (TreeModel_Tools::RestoreState (myTreeView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
continue;
else if (myViewWindow && View_Window::RestoreState(myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
continue;
}
@@ -305,7 +314,7 @@ void MessageView_Window::UpdateContent()
myParameters->SetFileNames (aName, aNames);
isUpdated = true;
}
Handle(Message_Report) aDefaultReport = Message::DefaultReport (Standard_False);
Handle(Message_Report) aDefaultReport = Message::DefaultReport();
MessageModel_TreeModel* aViewModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
if (!aDefaultReport.IsNull() && !aViewModel->HasReport (aDefaultReport))
{
@@ -315,6 +324,7 @@ void MessageView_Window::UpdateContent()
//onReloadReport();
updateTreeModel();
updateVisibleColumns();
}
// =======================================================================
@@ -372,7 +382,10 @@ void MessageView_Window::Init (NCollection_List<Handle(Standard_Transient)>& the
// =======================================================================
void MessageView_Window::openFile(const TCollection_AsciiString& theFileName)
{
const Handle(Message_Report)& aReport = Message::DefaultReport();
if (theFileName.IsEmpty())
return;
const Handle(Message_Report)& aReport = Message::DefaultReport (Standard_True);
//Handle(Message_Report) aReport = new Message_Report();
if (aReport->MessageWriter().IsNull())
@@ -407,7 +420,7 @@ void MessageView_Window::addReport (const Handle(Message_Report)& theReport,
MessageModel_TreeModel* aModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
aModel->AddReport (theReport, theReportDescription);
updateVisibleColumns();
//updateVisibleColumns();
}
// =======================================================================
@@ -466,7 +479,8 @@ void MessageView_Window::onTreeViewContextMenuRequested (const QPoint& thePositi
}
if (aRootItem)
{
aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Import Report"), SLOT (onImportReport()), myMainWindow, this));
aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Create Default Report"),
SLOT (onCreateDefaultReport()), myMainWindow, this));
// unite
//MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
//aMenu->addAction (ViewControl_Tools::CreateAction (aTreeModel->IsUniteAlerts() ? tr ("SetUniteAlerts - OFF") : tr ("SetUniteAlerts - ON"),
@@ -545,6 +559,18 @@ void MessageView_Window::onPropertyViewDataChanged()
updatePreviewPresentation();
}
// =======================================================================
// function : onHeaderResized
// purpose :
// =======================================================================
void MessageView_Window::onHeaderResized (int theSectionId, int, int)
{
TreeModel_ModelBase* aViewModel = dynamic_cast<TreeModel_ModelBase*> (myTreeView->model());
TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem (theSectionId);
aSection->SetWidth (myTreeView->columnWidth (theSectionId));
}
// =======================================================================
// function : onEraseAllPerformed
// purpose :
@@ -576,32 +602,36 @@ void MessageView_Window::onExportReport()
if (!aReportItem)
return;
QString aFilter (tr ("Document file (*.xml *)"));
QString aFilter (tr ("Document file (*.json *)"));
QString aSelectedFilter;
QString aFileName = QFileDialog::getSaveFileName (0, tr ("Export report to file"), QString(), aFilter, &aSelectedFilter);
Handle(Message_Report) aReport = aReportItem->GetReport();
if (aReport->MessageWriter().IsNull())
aReport->SetMessageWriter (new XmlDrivers_MessageReportStorage());
Standard_SStream aStream;
aReport->DumpJson(aStream);
aReport->MessageWriter()->SetFileName (TCollection_AsciiString (aFileName.toStdString().c_str()));
aReport->MessageWriter()->ExportReport (aReport);
QFile aLogFile(aFileName);
if (!aLogFile.open(QFile::WriteOnly | QFile::Text))
{
return;
}
QTextStream anOut( &aLogFile );
anOut << Standard_Dump::FormatJson (aStream).ToCString();//aStream.str().c_str();
aLogFile.close();
}
// =======================================================================
// function : onImportReport
// function : onCreateDefaultReport
// purpose :
// =======================================================================
void MessageView_Window::onImportReport()
void MessageView_Window::onCreateDefaultReport()
{
QString aFilter (tr ("Document file (*.cbf *)"));
QString aSelectedFilter;
if (!Message::DefaultReport().IsNull())
{
return;
}
QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
aSelectionModel->clear();
QString aFileName = QFileDialog::getOpenFileName (0, tr("Import report"), QString(), aSelectedFilter);
openFile (TCollection_AsciiString (aFileName.toStdString().c_str()));
addReport (Message::DefaultReport (Standard_True));
}
// =======================================================================
@@ -742,10 +772,13 @@ void MessageView_Window::onPreviewChildren()
// =======================================================================
void MessageView_Window::addActivateMetricActions (QMenu* theMenu)
{
Handle(Message_Report) aReport = Message::DefaultReport();
if (aReport.IsNull())
{
return;
}
QMenu* aSubMenu = new QMenu ("Activate metric");
Handle(Message_Report) aReport = Message::DefaultReport (Standard_True);
for (int aMetricId = (int)Message_MetricType_None + 1; aMetricId <= (int)Message_MetricType_MemHeapUsage; aMetricId++)
{
Message_MetricType aMetricType = (Message_MetricType)aMetricId;
@@ -773,7 +806,7 @@ void MessageView_Window::OnActivateMetric()
if (!Message::MetricFromString (anAction->text().toStdString().c_str(), aMetricType))
return;
Handle(Message_Report) aReport = Message::DefaultReport (Standard_True);
Handle(Message_Report) aReport = Message::DefaultReport();
const NCollection_Map<Message_MetricType>& anActiveMetrics = aReport->ActiveMetrics();
aReport->SetActiveMetric (aMetricType, !anActiveMetrics.Contains (aMetricType));
@@ -901,9 +934,8 @@ void MessageView_Window::updateVisibleColumns()
{
int aColumnId = aMetricColumns[i];
myTreeView->setColumnHidden (aColumnId, isColumnHidden);
TreeModel_HeaderSection aSection = aViewModel->GetHeaderItem (aColumnId);
aSection.SetIsHidden (isColumnHidden);
aViewModel->SetHeaderItem (aColumnId, aSection);
TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem (aColumnId);
aSection->SetIsHidden (isColumnHidden);
}
}
}

View File

@@ -136,14 +136,17 @@ protected slots:
//! Update tree view item, preview presentation by item value change
void onPropertyViewDataChanged();
//! Update tree view header item width
void onHeaderResized (int theSectionId, int, int);
//! Updates visibility states by erase all in context
void onEraseAllPerformed();
//! Export report into document
void onExportReport();
//! Import report into document
void onImportReport();
//! Create default report into document
void onCreateDefaultReport();
//! Unite alerts in view model
//void onUniteAlerts();

View File

@@ -128,8 +128,8 @@ int main (int argc, char** argv)
aPlugins.insert("TKShapeView");
aPlugins.insert("TKVInspector");
Handle(Message_Report) aReport = Message::DefaultReport (Standard_True);
aReport->SetLimit (100);//30);
//Handle(Message_Report) aReport = Message::DefaultReport (Standard_True);
//aReport->SetLimit (100);//30);
aPlugins.insert("TKMessageView");
//anActivatedPluginName = "TKVInspector";

View File

@@ -55,7 +55,7 @@ void TreeModel_ContextMenu::onTreeViewHeaderContextMenuRequested (const QPoint&
int aNbSections = aModel->columnCount();
for (int aColumnId = 0; aColumnId < aNbSections; aColumnId++)
{
QAction* anAction = ViewControl_Tools::CreateAction (aModel->GetHeaderItem (aColumnId).GetName(),
QAction* anAction = ViewControl_Tools::CreateAction (aModel->ChangeHeaderItem (aColumnId)->GetName(),
SLOT (onColumnVisibilityChanged()), myTreeView, this);
anAction->setCheckable (true);
anAction->setChecked (!myTreeView->isColumnHidden (aColumnId));

View File

@@ -14,6 +14,8 @@
// commercial license or contractual agreement.
#include <inspector/TreeModel_ItemBase.hxx>
#include <inspector/TreeModel_ColumnType.hxx>
#include <inspector/TreeModel_ItemProperties.hxx>
#include <inspector/TreeModel_ItemRole.hxx>
#include <inspector/TreeModel_ItemStream.hxx>
@@ -195,7 +197,7 @@ QVariant TreeModel_ItemBase::initValue (const int theItemRole) const
switch (Column())
{
case 1: { return Row(); }
case TreeModel_ColumnType_Row: { return Row(); }
}
return QVariant();

View File

@@ -47,9 +47,9 @@ TreeModel_ModelBase::TreeModel_ModelBase (QObject* theParent)
// =======================================================================
void TreeModel_ModelBase::InitColumns()
{
SetHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
SetHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth()));
SetHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH));
setHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
setHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth()));
setHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH));
}
// =======================================================================
@@ -178,7 +178,7 @@ QVariant TreeModel_ModelBase::headerData (int theSection, Qt::Orientation theOri
if (IsUseVisibilityColumn() && theSection == TreeModel_ColumnType_Visibility)
return QVariant();
return GetHeaderItem (theSection).GetName();
return myHeaderValues[theSection].GetName();
}
// =======================================================================
@@ -232,23 +232,6 @@ void TreeModel_ModelBase::EmitDataChanged (const QModelIndex& theTopLeft, const
#endif
}
// =======================================================================
// function : SetHeaderItem
// purpose :
// =======================================================================
void TreeModel_ModelBase::SetHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection)
{
if (theSection.IsEmpty())
{
// remove section
myHeaderValues.remove (theColumnId);
myRootItems.remove (theColumnId);
}
myHeaderValues[theColumnId] = theSection;
createRoot (theColumnId);
}
// =======================================================================
// function : Selected
// purpose :
@@ -339,6 +322,23 @@ void TreeModel_ModelBase::createRoot (const int theColumnId)
myRootItems.insert (theColumnId, createRootItem (theColumnId));
}
// =======================================================================
// function : setHeaderItem
// purpose :
// =======================================================================
void TreeModel_ModelBase::setHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection)
{
if (theSection.IsEmpty())
{
// remove section
myHeaderValues.remove (theColumnId);
myRootItems.remove (theColumnId);
}
myHeaderValues[theColumnId] = theSection;
createRoot (theColumnId);
}
// =======================================================================
// function : getIndexValue
// purpose :

View File

@@ -141,12 +141,7 @@ public:
//! Returns whether the column is hidden by default
//! \param theColumnId a column index
//! \return header section values container
TreeModel_HeaderSection GetHeaderItem (const int theColumnId) const { return myHeaderValues[theColumnId]; }
//! Sets header properties item.
//! \param theColumnId a column index
//! \param theSection a section value
Standard_EXPORT void SetHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection);
TreeModel_HeaderSection* ChangeHeaderItem (const int theColumnId) { return &myHeaderValues[theColumnId]; }
//! Returns count of columns in the model
//! \param theParent an index of the parent item
@@ -191,6 +186,11 @@ protected:
//! \param theColumnId index of a column
virtual TreeModel_ItemBasePtr createRootItem (const int theColumnId) = 0;
//! Sets header properties item.
//! \param theColumnId a column index
//! \param theSection a section value
Standard_EXPORT void setHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection);
//! Converts the item shared pointer to void* type
//! \param theItem
//! \return an item pointer

View File

@@ -89,6 +89,7 @@ void TreeModel_Tools::SaveState (QTreeView* theTreeView, QMap<QString, QString>&
QStringList aColumnWidths, aHiddenColumns;
for (int aColumnId = 0; aColumnId < theTreeView->model()->columnCount(); aColumnId++)
{
int aWidth = theTreeView->columnWidth (aColumnId);
if (theTreeView->isColumnHidden (aColumnId))
{
aHiddenColumns.append (QString::number (aColumnId));
@@ -121,18 +122,18 @@ bool TreeModel_Tools::RestoreState (QTreeView* theTreeView, const QString& theKe
}
else if (theKey == thePrefix + "columns_hidden")
{
int aColumnSize = theTreeView->model()->columnCount();
QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
QList<int> aColumnIds;
for (int aValueId = 0; aValueId < aValues.size(); aValueId++)
{
if (aValueId < aColumnSize)
aColumnIds.append (aValues.at (aValueId).toInt());
}
for (int aColumnId = 0; aColumnId < aColumnSize; aColumnId++)
{
theTreeView->setColumnHidden (aColumnId, aColumnIds.contains(aColumnId) == true);
}
//int aColumnSize = theTreeView->model()->columnCount();
//QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
//QList<int> aColumnIds;
//for (int aValueId = 0; aValueId < aValues.size(); aValueId++)
//{
// if (aValueId < aColumnSize)
// aColumnIds.append (aValues.at (aValueId).toInt());
//}
//for (int aColumnId = 0; aColumnId < aColumnSize; aColumnId++)
//{
// theTreeView->setColumnHidden (aColumnId, aColumnIds.contains(aColumnId) == true);
//}
}
else
return false;
@@ -149,9 +150,9 @@ void TreeModel_Tools::SetDefaultHeaderSections(QTreeView* theTreeView)
for (int aColumnId = 0, aNbColumns = aTreeModel->columnCount(); aColumnId < aNbColumns; aColumnId++)
{
TreeModel_HeaderSection aSection = aTreeModel->GetHeaderItem (aColumnId);
theTreeView->setColumnWidth (aColumnId, aSection.GetWidth());
theTreeView->setColumnHidden (aColumnId, aSection.IsHidden());
TreeModel_HeaderSection* aSection = aTreeModel->ChangeHeaderItem (aColumnId);
theTreeView->setColumnWidth (aColumnId, aSection->GetWidth());
theTreeView->setColumnHidden (aColumnId, aSection->IsHidden());
}
}
@@ -170,8 +171,10 @@ void TreeModel_Tools::UseVisibilityColumn (QTreeView* theTreeView, const bool th
aHeader->moveSection (TreeModel_ColumnType_Name, TreeModel_ColumnType_Visibility);
TreeModel_ModelBase* aModel = dynamic_cast<TreeModel_ModelBase*> (theTreeView->model());
aModel->SetHeaderItem (TreeModel_ColumnType_Visibility,
TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth()));
TreeModel_HeaderSection* anItem = aModel->ChangeHeaderItem ((int)TreeModel_ColumnType_Visibility);
anItem->SetIsHidden (theActive);
anItem->SetWidth (TreeModel_ModelBase::ColumnVisibilityWidth());
aModel->SetUseVisibilityColumn (theActive);
}

View File

@@ -43,7 +43,7 @@ QVariant VInspector_ItemBase::initValue (const int theItemRole) const
case 3: return Standard_Dump::GetPointerInfo (Object(), true).ToCString();
}
return QVariant();
return TreeModel_ItemBase::initValue (theItemRole);
}
// =======================================================================

View File

@@ -43,8 +43,8 @@ void VInspector_ViewModel::InitColumns()
{
TreeModel_ModelBase::InitColumns();
SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH));
SetHeaderItem (4, TreeModel_HeaderSection ("SelectedOwners", -1));
setHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH));
setHeaderItem (4, TreeModel_HeaderSection ("SelectedOwners", -1));
}
// =======================================================================

View File

@@ -54,13 +54,13 @@ void VInspector_ViewModelHistory::InitColumns()
{
TreeModel_ModelBase::InitColumns();
SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
SetHeaderItem (1, TreeModel_HeaderSection ("Visibility", COLUMN_SIZE_WIDTH)); // visualization item
SetHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH));
SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH));
SetHeaderItem (4, TreeModel_HeaderSection ("Shape type", COLUMN_SHAPE_TYPE_WIDTH));
SetHeaderItem (5, TreeModel_HeaderSection ("AIS Name", COLUMN_AIS_NAME_WIDTH));
SetHeaderItem (6, TreeModel_HeaderSection ("Selected/Highlighted", -1));
setHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
setHeaderItem (1, TreeModel_HeaderSection ("Visibility", COLUMN_SIZE_WIDTH)); // visualization item
setHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH));
setHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH));
setHeaderItem (4, TreeModel_HeaderSection ("Shape type", COLUMN_SHAPE_TYPE_WIDTH));
setHeaderItem (5, TreeModel_HeaderSection ("AIS Name", COLUMN_AIS_NAME_WIDTH));
setHeaderItem (6, TreeModel_HeaderSection ("Selected/Highlighted", -1));
for (int aColumnId = 0, aNbColumns = columnCount(); aColumnId < aNbColumns; aColumnId++)
{

View File

@@ -112,9 +112,8 @@ VInspector_Window::VInspector_Window()
aTreeModel->InitColumns();
myTreeView->setModel (aTreeModel);
// hide Visibility column
TreeModel_HeaderSection anItem = aTreeModel->GetHeaderItem ((int)TreeModel_ColumnType_Visibility);
anItem.SetIsHidden (true);
aTreeModel->SetHeaderItem ((int)TreeModel_ColumnType_Visibility, anItem);
TreeModel_HeaderSection* anItem = aTreeModel->ChangeHeaderItem ((int)TreeModel_ColumnType_Visibility);
anItem->SetIsHidden (true);
connect (myTreeView, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT (onTreeViewContextMenuRequested(const QPoint&)));
@@ -157,12 +156,11 @@ VInspector_Window::VInspector_Window()
connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
this, SLOT (onHistoryViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
anItem = aHistoryModel->GetHeaderItem (0);
anItem = aHistoryModel->ChangeHeaderItem (0);
// hide Visibility column
TreeModel_Tools::UseVisibilityColumn (myHistoryView, false);
anItem = aHistoryModel->GetHeaderItem ((int)TreeModel_ColumnType_Visibility);
anItem.SetIsHidden (true);
aHistoryModel->SetHeaderItem ((int)TreeModel_ColumnType_Visibility, anItem);
anItem = aHistoryModel->ChangeHeaderItem ((int)TreeModel_ColumnType_Visibility);
anItem->SetIsHidden (true);
QModelIndex aParentIndex = myHistoryView->model()->index (0, 0);
myHistoryView->setExpanded (aParentIndex, true);