This gets down the memory usage down quite a bit.
//QStyledItemDelegate::paint(painter, option, index);
QStyle *style = QApplication::style();
style->drawControl(QStyle::CE_ItemViewItem, &option, painter, 0);
- if (!event->state().isEmpty()) {
+ if (event->hasState()) {
QPixmap px = m_stateEmblem.pixmap(option.rect.height(),
option.rect.height());
painter->drawPixmap(option.rect.topLeft(), px);
ApiTraceState ApiTrace::defaultState() const
{
ApiTraceFrame *frame = frameAt(0);
- if (!frame)
+ if (!frame || !frame->hasState())
return ApiTraceState();
- return frame->state();
+ return *frame->state();
}
void ApiTrace::callEdited(ApiTraceCall *call)
ApiTraceEvent::ApiTraceEvent()
: m_type(ApiTraceEvent::None),
+ m_hasBinaryData(false),
+ m_binaryDataIndex(0),
+ m_state(0),
m_staticText(0)
{
}
ApiTraceEvent::ApiTraceEvent(Type t)
: m_type(t),
+ m_hasBinaryData(false),
+ m_binaryDataIndex(0),
+ m_state(0),
m_staticText(0)
{
}
ApiTraceEvent::~ApiTraceEvent()
{
+ delete m_state;
delete m_staticText;
}
QVariantMap ApiTraceEvent::stateParameters() const
{
- return m_state.parameters();
+ if (m_state) {
+ return m_state->parameters();
+ } else {
+ return QVariantMap();
+ }
}
-ApiTraceState ApiTraceEvent::state() const
+ApiTraceState *ApiTraceEvent::state() const
{
return m_state;
}
-void ApiTraceEvent::setState(const ApiTraceState &state)
+void ApiTraceEvent::setState(ApiTraceState *state)
{
m_state = state;
}
ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, const Trace::Call *call)
: ApiTraceEvent(ApiTraceEvent::Call),
- m_parentFrame(parentFrame),
- m_hasBinaryData(false),
- m_binaryDataIndex(0)
+ m_parentFrame(parentFrame)
{
ApiTrace *trace = parentTrace();
{
public:
enum Type {
- None,
- Call,
- Frame
+ None = 0,
+ Call = 1 << 0,
+ Frame = 1 << 1
};
public:
ApiTraceEvent();
ApiTraceEvent(Type t);
virtual ~ApiTraceEvent();
- Type type() const { return m_type; }
+ Type type() const { return (Type)m_type; }
virtual QStaticText staticText() const = 0;
virtual int numChildren() const = 0;
QVariantMap stateParameters() const;
- ApiTraceState state() const;
- void setState(const ApiTraceState &state);
+ ApiTraceState *state() const;
+ void setState(ApiTraceState *state);
+ bool hasState() const
+ {
+ return m_state && !m_state->isEmpty();
+ }
protected:
- Type m_type;
- ApiTraceState m_state;
+ int m_type : 4;
+ mutable bool m_hasBinaryData;
+ mutable int m_binaryDataIndex:8;
+ ApiTraceState *m_state;
mutable QStaticText *m_staticText;
};
mutable QString m_richText;
mutable QString m_searchText;
- mutable bool m_hasBinaryData;
- mutable int m_binaryDataIndex;
};
Q_DECLARE_METATYPE(ApiTraceCall*);
const QString stateText = tr("State info available.");
if (itm->type() == ApiTraceEvent::Call) {
ApiTraceCall *call = static_cast<ApiTraceCall*>(itm);
- if (call->state().isEmpty())
+ if (!call->hasState())
return QString::fromLatin1("%1) <b>%2</b>")
.arg(call->index())
.arg(call->name());
QString text = QObject::tr("%1) Frame ")
.arg(frame->number);
int binaryDataSize = frame->binaryDataSize() / 1024;
- if (frame->state().isEmpty())
+ if (!frame->hasState())
return QObject::tr(
"<b>%1 </b>(binary data size = %2kB)")
.arg(text)
m_ui.detailsDock->hide();
m_ui.vertexDataDock->hide();
}
- if (m_selectedEvent && !m_selectedEvent->state().isEmpty()) {
+ if (m_selectedEvent && m_selectedEvent->hasState()) {
fillStateForFrame();
} else
m_ui.stateDock->hide();
void MainWindow::fillStateForFrame()
{
- if (!m_selectedEvent || m_selectedEvent->state().isEmpty())
+ if (!m_selectedEvent || !m_selectedEvent->hasState())
return;
if (m_nonDefaultsLookupEvent) {
defaultParams = defaultState.parameters();
}
- const ApiTraceState &state = m_selectedEvent->state();
+ const ApiTraceState &state = *m_selectedEvent->state();
m_ui.stateTreeWidget->clear();
QList<QTreeWidgetItem *> items;
variantMapToItems(state.parameters(), defaultParams, items);
this, SLOT(replayFinished(const QString&)));
connect(m_retracer, SIGNAL(error(const QString&)),
this, SLOT(replayError(const QString&)));
- connect(m_retracer, SIGNAL(foundState(const ApiTraceState&)),
- this, SLOT(replayStateFound(const ApiTraceState&)));
+ connect(m_retracer, SIGNAL(foundState(ApiTraceState*)),
+ this, SLOT(replayStateFound(ApiTraceState*)));
connect(m_retracer, SIGNAL(retraceErrors(const QList<RetraceError>&)),
this, SLOT(slotRetraceErrors(const QList<RetraceError>&)));
this, SLOT(slotErrorSelected(QTreeWidgetItem*)));
}
-void MainWindow::replayStateFound(const ApiTraceState &state)
+void MainWindow::replayStateFound(ApiTraceState *state)
{
m_stateEvent->setState(state);
m_model->stateSetOnEvent(m_stateEvent);
void replayStart();
void replayStop();
void replayFinished(const QString &output);
- void replayStateFound(const ApiTraceState &state);
+ void replayStateFound(ApiTraceState *state);
void replayError(const QString &msg);
void startedLoadingTrace();
void finishedLoadingTrace();
this, SIGNAL(finished(const QString&)));
connect(retrace, SIGNAL(error(const QString&)),
this, SIGNAL(error(const QString&)));
- connect(retrace, SIGNAL(foundState(const ApiTraceState&)),
- this, SIGNAL(foundState(const ApiTraceState&)));
+ connect(retrace, SIGNAL(foundState(ApiTraceState*)),
+ this, SIGNAL(foundState(ApiTraceState*)));
connect(retrace, SIGNAL(retraceErrors(const QList<RetraceError>&)),
this, SIGNAL(retraceErrors(const QList<RetraceError>&)));
if (m_captureState) {
bool ok = false;
QVariantMap parsedJson = m_jsonParser->parse(output, &ok).toMap();
- ApiTraceState state(parsedJson);
+ ApiTraceState *state = new ApiTraceState(parsedJson);
emit foundState(state);
msg = tr("State fetched.");
} else {
signals:
void finished(const QString &output);
void error(const QString &msg);
- void foundState(const ApiTraceState &state);
+ void foundState(ApiTraceState *state);
void retraceErrors(const QList<RetraceError> &errors);
private slots:
signals:
void finished(const QString &output);
- void foundState(const ApiTraceState &state);
+ void foundState(ApiTraceState *state);
void error(const QString &msg);
void retraceErrors(const QList<RetraceError> &errors);