#include "apitracecall.h"
#include <QObject>
+#include <QSet>
class LoaderThread;
int numFrames() const;
int numCallsInFrame(int idx) const;
+ void callEdited(ApiTraceCall *call);
+ void callReverted(ApiTraceCall *call);
+
+ bool isEdited() const;
+
public slots:
void setFileName(const QString &name);
void setFrameMarker(FrameMarker marker);
void finishedLoadingTrace();
void invalidated();
void framesInvalidated();
+ void changed(ApiTraceCall *call);
void framesAdded(int oldCount, int numAdded);
void callsAdded(int oldCount, int numAdded);
FrameMarker m_frameMarker;
LoaderThread *m_loader;
+
+ QSet<ApiTraceCall*> m_editedCalls;
};
#endif
#include "apitracecall.h"
+#include "apitrace.h"
#include "trace_model.hpp"
#include <QDebug>
QVariantList ApiTraceCall::arguments() const
{
- return m_argValues;
+ if (m_editedValues.isEmpty())
+ return m_argValues;
+ else
+ return m_editedValues;
}
QVariant ApiTraceCall::returnValue() const
m_parentTrace = trace;
}
+QVariantList ApiTraceCall::originalValues() const
+{
+ return m_argValues;
+}
+
+void ApiTraceCall::setEditedValues(const QVariantList &lst)
+{
+ ApiTrace *trace = 0;
+ if (m_parentFrame)
+ trace = m_parentFrame->parentTrace();
+ m_editedValues = lst;
+
+ if (trace) {
+ if (!lst.isEmpty()) {
+ trace->callEdited(this);
+ } else {
+ trace->callReverted(this);
+ }
+ }
+}
+
+QVariantList ApiTraceCall::editedValues() const
+{
+ return m_editedValues;
+}
+
+bool ApiTraceCall::edited() const
+{
+ return !m_editedValues.isEmpty();
+}
+
void ArgumentsEditor::setCall(ApiTraceCall *call)
{
- if (m_call != call) {
- m_call = call;
- setupCall();
- }
+ m_call = call;
+ setupCall();
}
ApiTraceCall * ArgumentsEditor::call() const
QStringList argNames = m_call->argNames();
QList<QVariant> originalValues = m_call->arguments();
for (int i = 0; i < argNames.count(); ++i) {
+ bool changed = false;
QString argName = argNames[i];
QVariant argValue = originalValues[i];
- QVariant editorValue = valueForName(argName, argValue);
+ QVariant editorValue = valueForName(argName, argValue, &changed);
qDebug()<<"Arg = "<<argName;
qDebug()<<"\toriginal = "<<argValue;
qDebug()<<"\teditor = "<<editorValue;
+ qDebug()<<"\tchanged = "<<changed;
}
QDialog::accept();
}
QVariant ArgumentsEditor::valueForName(const QString &name,
- const QVariant &originalValue) const
+ const QVariant &originalValue,
+ bool *changed) const
{
QVariant val;
+ *changed = false;
+
//Handle string arrays specially
if (isVariantStringArray(originalValue)) {
ApiArray array = originalValue.value<ApiArray>();
- return arrayFromEditor(array);
+ return arrayFromEditor(array, changed);
}
for (int topRow = 0; topRow < m_model->rowCount(); ++topRow) {
if (argName == name) {
if (originalValue.userType() == QMetaType::type("ApiArray")) {
ApiArray array = originalValue.value<ApiArray>();
- val = arrayFromIndex(nameIdx, array);
+ val = arrayFromIndex(nameIdx, array, changed);
} else {
QModelIndex valIdx = m_model->index(topRow, 1, QModelIndex());
val = valIdx.data();
+ if (val != originalValue)
+ *changed = true;
}
}
}
}
QVariant ArgumentsEditor::arrayFromIndex(const QModelIndex &parentIndex,
- const ApiArray &origArray) const
+ const ApiArray &origArray,
+ bool *changed) const
{
QList<QVariant> origValues = origArray.values();
+
+ *changed = false;
+
if (origValues.isEmpty())
return QVariant::fromValue(ApiArray());
for (int i = 0; i < origValues.count(); ++i) {
QModelIndex valIdx = m_model->index(i, 1, parentIndex);
QVariant var = valIdx.data();
+ QVariant origValue = origValues[i];
+ if (var != origValue)
+ *changed = true;
//qDebug()<<"\t\tarray "<<i<<") "<<var;
lst.append(var);
}
return QVariant::fromValue(ApiArray(lst));
}
-QVariant ArgumentsEditor::arrayFromEditor(const ApiArray &origArray) const
+QVariant ArgumentsEditor::arrayFromEditor(const ApiArray &origArray,
+ bool *changed) const
{
QList<QVariant> vals;
QList<QVariant> origValues = origArray.values();
Q_ASSERT(isVariantStringArray(QVariant::fromValue(origArray)));
+ *changed = false;
//shaders
for (int i = 0; i < m_ui.selectStringCB->count(); ++i) {
QVariant val = m_ui.selectStringCB->itemData(i);
+ QVariant origValue = origValues[i];
+ if (origValue != val)
+ *changed = true;
vals.append(val);
}
return QVariant::fromValue(ApiArray(vals));
void setupCall();
void setupShaderEditor(const QList<QVariant> &sources);
QVariant valueForName(const QString &name,
- const QVariant &orignalValue) const;
+ const QVariant &orignalValue,
+ bool *changed) const;
QVariant arrayFromIndex(const QModelIndex &index,
- const ApiArray &array) const;
- QVariant arrayFromEditor(const ApiArray &origArray) const;
+ const ApiArray &array,
+ bool *changed) const;
+ QVariant arrayFromEditor(const ApiArray &origArray,
+ bool *changed) const;
private:
Ui_ArgumentsEditor m_ui;
QStandardItemModel *m_model;