QmlProfiler: Express record button state in a single function

This way we get a concise description of the inputs it reacts to and we
don't have to dereference the pointer in unrelated code, which lead to
crashes on shutdown.

Change-Id: Ieb75ab95cccc0d1f88420b270909c97867a5c3e0
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Ulf Hermann
2017-08-10 16:00:37 +02:00
parent 6920d84745
commit 5dbb4f0907
2 changed files with 45 additions and 53 deletions

View File

@@ -139,8 +139,6 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent)
d->m_profilerState = new QmlProfilerStateManager(this); d->m_profilerState = new QmlProfilerStateManager(this);
connect(d->m_profilerState, &QmlProfilerStateManager::stateChanged, connect(d->m_profilerState, &QmlProfilerStateManager::stateChanged,
this, &QmlProfilerTool::profilerStateChanged); this, &QmlProfilerTool::profilerStateChanged);
connect(d->m_profilerState, &QmlProfilerStateManager::clientRecordingChanged,
this, &QmlProfilerTool::clientRecordingChanged);
connect(d->m_profilerState, &QmlProfilerStateManager::serverRecordingChanged, connect(d->m_profilerState, &QmlProfilerStateManager::serverRecordingChanged,
this, &QmlProfilerTool::serverRecordingChanged); this, &QmlProfilerTool::serverRecordingChanged);
connect(d->m_profilerState, &QmlProfilerStateManager::recordedFeaturesChanged, connect(d->m_profilerState, &QmlProfilerStateManager::recordedFeaturesChanged,
@@ -206,8 +204,6 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent)
connect(d->m_recordFeaturesMenu, &QMenu::triggered, connect(d->m_recordFeaturesMenu, &QMenu::triggered,
this, &QmlProfilerTool::toggleRequestedFeature); this, &QmlProfilerTool::toggleRequestedFeature);
setRecording(d->m_profilerState->clientRecording());
d->m_clearButton = new QToolButton; d->m_clearButton = new QToolButton;
d->m_clearButton->setIcon(Utils::Icons::CLEAN_TOOLBAR.icon()); d->m_clearButton->setIcon(Utils::Icons::CLEAN_TOOLBAR.icon());
d->m_clearButton->setToolTip(tr("Discard data")); d->m_clearButton->setToolTip(tr("Discard data"));
@@ -297,6 +293,46 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent)
model->createMarks(this, fileName); model->createMarks(this, fileName);
}); });
} }
auto updateRecordButton = [this]() {
const bool recording =
d->m_profilerState->currentState() != QmlProfilerStateManager::AppRunning
? d->m_profilerState->clientRecording() : d->m_profilerState->serverRecording();
const static QIcon recordOn = Debugger::Icons::RECORD_ON.icon();
const static QIcon recordOff = Debugger::Icons::RECORD_OFF.icon();
// update display
d->m_recordButton->setToolTip(recording ? tr("Disable Profiling") : tr("Enable Profiling"));
d->m_recordButton->setIcon(recording ? recordOn : recordOff);
d->m_recordButton->setChecked(recording);
switch (d->m_profilerModelManager->state()) {
case QmlProfilerModelManager::Empty:
case QmlProfilerModelManager::AcquiringData:
case QmlProfilerModelManager::Done:
// Don't change the recording button if the application cannot react to it.
d->m_recordButton->setEnabled(d->m_profilerState->currentState()
!= QmlProfilerStateManager::AppStopRequested
&& d->m_profilerState->currentState()
!= QmlProfilerStateManager::AppDying);
break;
case QmlProfilerModelManager::ProcessingData:
case QmlProfilerModelManager::ClearingData:
d->m_recordButton->setEnabled(false);
break;
}
};
connect(d->m_profilerState, &QmlProfilerStateManager::stateChanged,
d->m_recordButton, updateRecordButton);
connect(d->m_profilerState, &QmlProfilerStateManager::serverRecordingChanged,
d->m_recordButton, updateRecordButton);
connect(d->m_profilerState, &QmlProfilerStateManager::clientRecordingChanged,
d->m_recordButton, updateRecordButton);
connect(d->m_profilerModelManager, &QmlProfilerModelManager::stateChanged,
d->m_recordButton, updateRecordButton);
updateRecordButton();
} }
QmlProfilerTool::~QmlProfilerTool() QmlProfilerTool::~QmlProfilerTool()
@@ -385,28 +421,6 @@ void QmlProfilerTool::recordingButtonChanged(bool recording)
} }
} }
void QmlProfilerTool::setRecording(bool recording)
{
const static QIcon recordOn = Debugger::Icons::RECORD_ON.icon();
const static QIcon recordOff = Debugger::Icons::RECORD_OFF.icon();
// update display
d->m_recordButton->setToolTip( recording ? tr("Disable Profiling") : tr("Enable Profiling"));
d->m_recordButton->setIcon(recording ? recordOn : recordOff);
d->m_recordButton->setChecked(recording);
// manage timer
if (d->m_profilerState->currentState() == QmlProfilerStateManager::AppRunning) {
if (recording) {
d->m_recordingTimer.start();
d->m_recordingElapsedTime.start();
} else {
d->m_recordingTimer.stop();
}
}
}
void QmlProfilerTool::gotoSourceLocation(const QString &fileUrl, int lineNumber, int columnNumber) void QmlProfilerTool::gotoSourceLocation(const QString &fileUrl, int lineNumber, int columnNumber)
{ {
if (lineNumber < 0 || fileUrl.isEmpty()) if (lineNumber < 0 || fileUrl.isEmpty())
@@ -498,7 +512,7 @@ void QmlProfilerTool::clearTextMarks()
bool QmlProfilerTool::prepareTool() bool QmlProfilerTool::prepareTool()
{ {
if (d->m_recordButton->isChecked()) { if (d->m_profilerState->clientRecording()) {
if (checkForUnsavedNotes()) { if (checkForUnsavedNotes()) {
clearData(); // clear right away to suppress second warning on server recording change clearData(); // clear right away to suppress second warning on server recording change
return true; return true;
@@ -754,28 +768,23 @@ void QmlProfilerTool::profilerDataModelStateChanged()
{ {
switch (d->m_profilerModelManager->state()) { switch (d->m_profilerModelManager->state()) {
case QmlProfilerModelManager::Empty : case QmlProfilerModelManager::Empty :
d->m_recordButton->setEnabled(true);
setButtonsEnabled(true); setButtonsEnabled(true);
break; break;
case QmlProfilerModelManager::ClearingData : case QmlProfilerModelManager::ClearingData :
clearTextMarks(); clearTextMarks();
d->m_recordButton->setEnabled(false);
setButtonsEnabled(false); setButtonsEnabled(false);
clearDisplay(); clearDisplay();
break; break;
case QmlProfilerModelManager::AcquiringData : case QmlProfilerModelManager::AcquiringData :
restoreFeatureVisibility(); restoreFeatureVisibility();
d->m_recordButton->setEnabled(true); // Press recording button to stop recording
setButtonsEnabled(false); // Other buttons disabled setButtonsEnabled(false); // Other buttons disabled
break; break;
case QmlProfilerModelManager::ProcessingData : case QmlProfilerModelManager::ProcessingData :
d->m_recordButton->setEnabled(false);
setButtonsEnabled(false); setButtonsEnabled(false);
break; break;
case QmlProfilerModelManager::Done : case QmlProfilerModelManager::Done :
showSaveOption(); showSaveOption();
updateTimeDisplay(); updateTimeDisplay();
d->m_recordButton->setEnabled(true);
setButtonsEnabled(true); setButtonsEnabled(true);
createTextMarks(); createTextMarks();
break; break;
@@ -826,13 +835,10 @@ void QmlProfilerTool::profilerStateChanged()
break; break;
} }
case QmlProfilerStateManager::Idle : case QmlProfilerStateManager::Idle :
// when the app finishes, set recording display to client status
setRecording(d->m_profilerState->clientRecording());
break; break;
case QmlProfilerStateManager::AppStopRequested: case QmlProfilerStateManager::AppStopRequested:
// Don't allow toggling the recording while data is loaded when application quits // Don't allow toggling the recording while data is loaded when application quits
if (d->m_profilerState->serverRecording()) { if (d->m_profilerState->serverRecording()) {
d->m_recordButton->setEnabled(false);
// Turn off recording and wait for remaining data // Turn off recording and wait for remaining data
d->m_profilerConnections->stopRecording(); d->m_profilerConnections->stopRecording();
} else { } else {
@@ -846,14 +852,6 @@ void QmlProfilerTool::profilerStateChanged()
} }
} }
void QmlProfilerTool::clientRecordingChanged()
{
// if application is running, display server record changes
// if application is stopped, display client record changes
if (d->m_profilerState->currentState() != QmlProfilerStateManager::AppRunning)
setRecording(d->m_profilerState->clientRecording());
}
void QmlProfilerTool::serverRecordingChanged() void QmlProfilerTool::serverRecordingChanged()
{ {
showLoadOption(); showLoadOption();
@@ -871,19 +869,16 @@ void QmlProfilerTool::serverRecordingChanged()
QMessageBox::Save) QMessageBox::Save)
showSaveDialog(); showSaveDialog();
setRecording(true); d->m_recordingTimer.start();
d->m_recordingElapsedTime.start();
if (!d->m_profilerModelManager->aggregateTraces() || if (!d->m_profilerModelManager->aggregateTraces() ||
d->m_profilerModelManager->state() == QmlProfilerModelManager::Done) d->m_profilerModelManager->state() == QmlProfilerModelManager::Done)
clearData(); clearData();
d->m_profilerModelManager->startAcquiring(); d->m_profilerModelManager->startAcquiring();
} else { } else {
setRecording(false); d->m_recordingTimer.stop();
if (!d->m_profilerModelManager->aggregateTraces())
// changes back once loading is finished, see profilerDataModelStateChanged()
if (!d->m_profilerModelManager->aggregateTraces()) {
d->m_recordButton->setEnabled(false);
d->m_profilerModelManager->acquiringDone(); d->m_profilerModelManager->acquiringDone();
}
} }
} else if (d->m_profilerState->currentState() == QmlProfilerStateManager::AppStopRequested) { } else if (d->m_profilerState->currentState() == QmlProfilerStateManager::AppStopRequested) {
d->m_profilerModelManager->acquiringDone(); d->m_profilerModelManager->acquiringDone();

View File

@@ -69,14 +69,11 @@ public:
public slots: public slots:
void profilerStateChanged(); void profilerStateChanged();
void clientRecordingChanged();
void serverRecordingChanged(); void serverRecordingChanged();
void clientsDisconnected(); void clientsDisconnected();
void setAvailableFeatures(quint64 features); void setAvailableFeatures(quint64 features);
void setRecordedFeatures(quint64 features); void setRecordedFeatures(quint64 features);
void recordingButtonChanged(bool recording); void recordingButtonChanged(bool recording);
void setRecording(bool recording);
void gotoSourceLocation(const QString &fileUrl, int lineNumber, int columnNumber); void gotoSourceLocation(const QString &fileUrl, int lineNumber, int columnNumber);
void selectType(int typeId); void selectType(int typeId);