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:
@@ -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"
|
||||
};
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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)
|
||||
};
|
||||
|
||||
|
@@ -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())
|
||||
}
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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
|
||||
|
@@ -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 :
|
||||
|
@@ -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.
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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());
|
||||
|
@@ -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();
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -49,7 +49,7 @@ DFBrowser_TreeModel::DFBrowser_TreeModel (QObject* theParent)
|
||||
// =======================================================================
|
||||
void DFBrowser_TreeModel::InitColumns()
|
||||
{
|
||||
SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
|
||||
setHeaderItem (0, TreeModel_HeaderSection ("Name"));
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
|
@@ -37,7 +37,7 @@ DFBrowserPane_TDataStdTreeNodeModel::DFBrowserPane_TDataStdTreeNodeModel (QObjec
|
||||
// =======================================================================
|
||||
void DFBrowserPane_TDataStdTreeNodeModel::InitColumns()
|
||||
{
|
||||
SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
|
||||
setHeaderItem (0, TreeModel_HeaderSection ("Name"));
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
|
@@ -170,6 +170,7 @@ void MessageModel_Actions::OnActivateReport()
|
||||
|
||||
Message::DefaultMessenger()->AddPrinter (MyPrinterToReport);
|
||||
Message::DefaultMessenger()->SetTraceLevel (1);
|
||||
Message::DefaultReport()->UpdateActiveInMessenger();
|
||||
|
||||
myTreeModel->UpdateTreeModel();
|
||||
}
|
||||
|
@@ -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())
|
||||
|
@@ -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
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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";
|
||||
|
@@ -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));
|
||||
|
@@ -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();
|
||||
|
@@ -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 :
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
|
@@ -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++)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user