Make sure we're on a consistent event before calling OnLogFileLoaded

* Certain panels like BufferViewer assume there is a current drawcall
  at startup and not an invalid event ID like 0. Normally the event
  browser is loaded first and sets the event ID, but if it's later in
  the list this will break.
This commit is contained in:
baldurk
2017-02-01 11:17:56 +00:00
parent 0a611417c1
commit 477df04072
5 changed files with 27 additions and 13 deletions
+10 -3
View File
@@ -312,6 +312,13 @@ void CaptureContext::LoadLogfileThreaded(const QString &logFile, const QString &
QVector<ILogViewerForm *> logviewers(m_LogViewers);
// make sure we're on a consistent event before invoking log viewer forms
const FetchDrawcall *draw = &m_Drawcalls.back();
while(!draw->children.empty())
draw = &draw->children.back();
SetEventID(logviewers, draw->eventID, true);
GUIInvoke::blockcall([&logviewers]() {
// notify all the registers log viewers that a log has been loaded
for(ILogViewerForm *logviewer : logviewers)
@@ -366,8 +373,8 @@ void CaptureContext::CloseLogfile()
}
}
void CaptureContext::SetEventID(ILogViewerForm *exclude, uint32_t selectedEventID, uint32_t eventID,
bool force)
void CaptureContext::SetEventID(const QVector<ILogViewerForm *> &exclude, uint32_t selectedEventID,
uint32_t eventID, bool force)
{
uint32_t prevSelectedEventID = m_SelectedEventID;
m_SelectedEventID = selectedEventID;
@@ -386,7 +393,7 @@ void CaptureContext::SetEventID(ILogViewerForm *exclude, uint32_t selectedEventI
for(ILogViewerForm *logviewer : m_LogViewers)
{
if(logviewer == exclude)
if(exclude.contains(logviewer))
continue;
if(force || prevSelectedEventID != selectedEventID)
+3 -3
View File
@@ -83,9 +83,9 @@ public:
void LoadLogfile(const QString &logFile, const QString &origFilename, bool temporary, bool local);
void CloseLogfile();
void SetEventID(ILogViewerForm *exclude, uint32_t selectedEventID, uint32_t eventID,
bool force = false);
void RefreshStatus() { SetEventID(NULL, m_SelectedEventID, m_EventID, true); }
void SetEventID(const QVector<ILogViewerForm *> &exclude, uint32_t selectedEventID,
uint32_t eventID, bool force = false);
void RefreshStatus() { SetEventID({}, m_SelectedEventID, m_EventID, true); }
void AddLogViewer(ILogViewerForm *f)
{
m_LogViewers.push_back(f);
+2 -2
View File
@@ -113,7 +113,7 @@ void EventBrowser::OnLogfileLoaded()
ui->events->expandItem(frame);
m_Ctx->SetEventID(this, lastEID, lastEID);
m_Ctx->SetEventID({this}, lastEID, lastEID);
}
void EventBrowser::OnLogfileClosed()
@@ -251,7 +251,7 @@ void EventBrowser::on_events_currentItemChanged(QTreeWidgetItem *current, QTreeW
uint EID = current->data(COL_EID, Qt::UserRole).toUInt();
uint lastEID = current->data(COL_LAST_EID, Qt::UserRole).toUInt();
m_Ctx->SetEventID(this, EID, lastEID);
m_Ctx->SetEventID({this}, EID, lastEID);
}
void EventBrowser::on_HideFindJump()
+1 -1
View File
@@ -1726,7 +1726,7 @@ void TextureViewer::texContextItem_triggered()
QVariant eid = act->property("eid");
if(eid.isValid())
{
m_Ctx->SetEventID(NULL, eid.toUInt(), eid.toUInt());
m_Ctx->SetEventID({}, eid.toUInt(), eid.toUInt());
return;
}
+11 -4
View File
@@ -613,6 +613,13 @@ namespace renderdocui.Code
List<ILogViewerForm> logviewers = new List<ILogViewerForm>();
logviewers.AddRange(m_LogViewers);
// make sure we're on a consistent event before invoking log viewer forms
FetchDrawcall draw = m_DrawCalls.Last();
while (draw.children != null && draw.children.Length > 0)
draw = draw.children.Last();
SetEventID(logviewers.ToArray(), draw.eventID, true);
// notify all the registers log viewers that a log has been loaded
foreach (var logviewer in logviewers)
{
@@ -893,15 +900,15 @@ namespace renderdocui.Code
public void RefreshStatus()
{
SetEventID(null, m_EventID, true);
SetEventID(new ILogViewerForm[] { }, m_EventID, true);
}
public void SetEventID(ILogViewerForm exclude, UInt32 eventID)
{
SetEventID(exclude, eventID, false);
SetEventID(new ILogViewerForm[] { exclude }, eventID, false);
}
private void SetEventID(ILogViewerForm exclude, UInt32 eventID, bool force)
private void SetEventID(ILogViewerForm[] exclude, UInt32 eventID, bool force)
{
m_EventID = eventID;
@@ -917,7 +924,7 @@ namespace renderdocui.Code
foreach (var logviewer in m_LogViewers)
{
if(logviewer == exclude)
if(exclude.Contains(logviewer))
continue;
Control c = (Control)logviewer;