You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/Standalone/Source/Driller/CombinedEventsControl.cpp

261 lines
8.5 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "StandaloneTools_precompiled.h"
#include <QtWidgets/QGridLayout>
#include "CombinedEventsControl.hxx"
#include <Source/Driller/moc_CombinedEventsControl.cpp>
#include "Annotations/AnnotationsHeaderView_Events.hxx"
#include "Axis.hxx"
#include "CollapsiblePanel.hxx"
#include "ChannelDataView.hxx"
#include "DrillerAggregator.hxx"
#include "DrillerEvent.h"
#include "DrillerMainWindowMessages.h"
#include <QEvent>
using namespace Racetrack;
namespace Driller
{
static const int k_raceTrackMinSize = 50;
static const int k_eventTrackSize = 20;
CombinedEventsControl::CombinedEventsControl(QWidget* parent, Qt::WindowFlags flags)
: QDockWidget(parent, flags)
{
m_ScrubberIndex = 0;
m_FirstIndex = 0;
m_LastIndex = 0;
QWidget* nullBar = new QWidget();
setTitleBarWidget(nullBar);
setFeatures(QDockWidget::NoDockWidgetFeatures);
setAllowedAreas(Qt::BottomDockWidgetArea);
m_collapsiblePanel = new CollapsiblePanel(this);
this->setWidget(m_collapsiblePanel);
m_Contents = new QWidget(this);
m_Contents->setGeometry(0, 22, 542, 34);
m_Contents->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
QVBoxLayout* layout = new QVBoxLayout();
layout->setMargin(0);
layout->setSpacing(2);
m_Contents->setLayout(layout);
m_collapsiblePanel->SetContent(m_Contents);
m_collapsiblePanel->SetTitle("Detailed Event View");
m_EventTrack = aznew CEQDataTrack(this);
m_EventTrack->SetupAxis("", 0.0f, 1.0f, false);
m_EventTrack->SetMarkerColor(Qt::darkMagenta);
m_EventTrack->setMinimumHeight(k_raceTrackMinSize);
m_annotationHeaderView = aznew AnnotationHeaderView_Events(this);
m_Contents->layout()->addWidget(m_annotationHeaderView);
m_Contents->layout()->addWidget(m_EventTrack);
m_EventTrack->installEventFilter(this);
connect(m_EventTrack, SIGNAL(EventRequestEventFocus(Driller::EventNumberType)), this, SLOT(OnEventTrackRequestEventFocus(Driller::EventNumberType)));
}
void CombinedEventsControl::SetIdentity(int identity)
{
m_identity = identity;
DrillerEventWindowMessages::Handler::BusConnect(m_identity);
}
bool CombinedEventsControl::eventFilter(QObject* obj, QEvent* event)
{
if (event->type() == QEvent::Resize)
{
if (obj == m_EventTrack)
{
QRect eventTrackGeometry = m_EventTrack->geometry();
QSize actualSize = QSize(eventTrackGeometry.x(), eventTrackGeometry.height());
emit InfoAreaGeometryChanged(actualSize);
}
}
// hand it to the owner
return QObject::eventFilter(obj, event);
}
Charts::Axis* CombinedEventsControl::GetAxis() const
{
return m_EventTrack->GetAxis();
}
CombinedEventsControl::~CombinedEventsControl()
{
DrillerEventWindowMessages::Handler::BusDisconnect(m_identity);
if (m_EventTrack)
{
delete m_EventTrack;
}
}
void CombinedEventsControl::ClearAggregatorList()
{
m_Aggregators.clear();
m_EventTrack->Clear();
m_EventTrack->setMinimumHeight(k_raceTrackMinSize);
m_ScrubberIndex = 0;
m_FirstIndex = 0;
m_LastIndex = 0;
}
void CombinedEventsControl::AddAggregatorList(DrillerNetworkMessages::AggregatorList& theList)
{
// m_EventStrip clear all existing channels and the channel axis
m_EventTrack->Clear();
for (DrillerNetworkMessages::AggregatorList::iterator iter = theList.begin(); iter != theList.end(); ++iter)
{
m_Aggregators.push_back(*iter);
int channelID = m_EventTrack->AddChannel((*iter)->GetName());
m_EventTrack->SetChannelColor(channelID, (*iter)->GetColor());
}
m_EventTrack->setMinimumHeight(k_raceTrackMinSize + static_cast<int>(m_Aggregators.size()) * k_eventTrackSize);
}
void CombinedEventsControl::AddAggregator(Aggregator& theAggregator)
{
m_Aggregators.push_back(&theAggregator);
int channelID = m_EventTrack->AddChannel(theAggregator.GetName());
m_EventTrack->SetChannelColor(channelID, theAggregator.GetColor());
m_EventTrack->setMinimumHeight(k_raceTrackMinSize + static_cast<int>(m_Aggregators.size()) * k_eventTrackSize);
}
void CombinedEventsControl::SetAnnotationsProvider(AnnotationsProvider* ptrAnnotations)
{
m_annotationHeaderView->AttachToAxis(ptrAnnotations, GetAxis());
}
void CombinedEventsControl::SetEndFrame(FrameNumberType /*frame*/)
{
m_EventTrack->update();
}
void CombinedEventsControl::SetSliderOffset(FrameNumberType /*frame*/)
{
}
void CombinedEventsControl::MouseClickInformed(int newValue)
{
emit InformOfMouseClick(newValue, 1, 0);
}
void CombinedEventsControl::MouseMoveInformed(int newValue)
{
emit InformOfMouseMove(newValue, 1, 0);
}
void CombinedEventsControl::OnEventScrubberboxChanged(int newValue)
{
emit EventRequestEventFocus(static_cast<EventNumberType>(newValue));
}
void CombinedEventsControl::SetScrubberFrame(FrameNumberType frame)
{
m_EventTrack->GetAxis()->Clear();
int temp_m_FirstIndex = 0x7fffffff;
int temp_m_LastIndex = 0;
AZ::s64 highestCount = 0;
int channelIdx = 0;
for (AZStd::list<Aggregator*>::iterator iter = m_Aggregators.begin(); iter != m_Aggregators.end(); ++iter, ++channelIdx)
{
m_EventTrack->ClearData(channelIdx);
size_t numEvents = (*iter)->NumOfEventsAtFrame(frame);
if (numEvents)
{
highestCount += numEvents;
EventNumberType eventIndexOffset = (*iter)->GetFirstIndexAtFrame(frame);
for (EventNumberType eventIndex = 0; eventIndex < static_cast<EventNumberType>(numEvents); ++eventIndex)
{
DrillerEvent* dep = (*iter)->GetEvents()[ eventIndex + eventIndexOffset ];
AZ::s64 geid = dep->GetGlobalEventId();
temp_m_FirstIndex = (int)geid < temp_m_FirstIndex ? (int)geid : temp_m_FirstIndex;
temp_m_LastIndex = (int)geid > temp_m_LastIndex ? (int)geid : temp_m_LastIndex;
//AZ_TracePrintf("LUA","First %d Last %d\n",temp_m_FirstIndex, temp_m_LastIndex);
m_EventTrack->AddData(channelIdx, (float)geid, (float)channelIdx);
}
}
}
m_FirstIndex = temp_m_FirstIndex;
m_LastIndex = temp_m_LastIndex;
m_EventTrack->GetAxis()->SetAxisRange((float)m_FirstIndex, (float)m_LastIndex);
m_EventTrack->GetAxis()->SetViewFull();
SanitizeScrubberIndex();
emit EventRequestEventFocus(m_ScrubberIndex);
}
void CombinedEventsControl::OnEventTrackRequestEventFocus(Driller::EventNumberType eventIndex)
{
emit EventRequestEventFocus(eventIndex);
}
//////////////////////////////////////////////////////////////////////////
// Event Window Messages
void CombinedEventsControl::EventFocusChanged(EventNumberType eventIdx)
{
m_ScrubberIndex = eventIdx;
SanitizeScrubberIndex();
m_EventTrack->SetMarkerPosition((float)m_ScrubberIndex);
}
void CombinedEventsControl::SanitizeScrubberIndex()
{
m_ScrubberIndex = m_ScrubberIndex < m_FirstIndex ? m_FirstIndex : m_ScrubberIndex;
m_ScrubberIndex = m_ScrubberIndex > m_LastIndex ? m_LastIndex : m_ScrubberIndex;
}
//////////////////////////////////////////////////////////////////////////
CEQDataTrack::CEQDataTrack(QWidget* parent, Qt::WindowFlags flags)
: DataRacetrack(parent, flags)
{
m_InsetT = 4;
m_InsetB = 12;
SetZeroBasedAxisNumbering(true);
setAutoFillBackground(false);
setAttribute(Qt::WA_OpaquePaintEvent, true);
}
CEQDataTrack::~CEQDataTrack()
{
}
}