From: Zack Rusin Date: Fri, 15 Apr 2011 05:45:05 +0000 (-0400) Subject: Start working on trace editing X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=963102f78ba207fe9a8ca30f9f76e44832e7e569;p=apitrace Start working on trace editing start with a widget to edit call arguments. right now in a dock to make it easier to test, but eventually will be in a dialog --- diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 6787043..fdc6c13 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -8,6 +8,7 @@ set(qapitrace_SRCS apitracecall.cpp apitracefilter.cpp apitracemodel.cpp + argumentseditor.cpp glsledit.cpp imageviewer.cpp jumpwidget.cpp @@ -28,6 +29,7 @@ qt4_automoc(${qapitrace_SRCS}) qt4_add_resources(qapitrace_SRCS qapitrace.qrc) set(qapitrace_UIS + ui/argumentseditor.ui ui/imageviewer.ui ui/jumpwidget.ui ui/mainwindow.ui @@ -42,7 +44,7 @@ QT4_WRAP_UI(qapitrace_UIS_H ${qapitrace_UIS}) #add_app_icon(qapitrace_SRCS ../icons/hi*-qapitrace.png) link_directories(${LINK_DIRECTORIES} ${QJSON_LIBRARY_DIRS}) -include_directories(${QT_INCLUDES} ${QJSON_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..) +include_directories(${QT_INCLUDES} ${QJSON_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..) add_definitions(-DBUILD_DIR="${CMAKE_CURRENT_BINARY_DIR}/..") diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 2d28e16..a975728 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -532,4 +532,9 @@ QList ApiTraceState::framebuffers() const return m_framebuffers; } +QList ApiArray::values() const +{ + return m_array; +} + diff --git a/gui/apitracecall.h b/gui/apitracecall.h index db5d38d..355b8c8 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -91,6 +91,7 @@ public: QString toString() const; + QList values() const; private: void init(const Trace::Array *arr); private: diff --git a/gui/argumentseditor.cpp b/gui/argumentseditor.cpp new file mode 100644 index 0000000..8f2b85c --- /dev/null +++ b/gui/argumentseditor.cpp @@ -0,0 +1,158 @@ +#include "argumentseditor.h" + +#include +#include + +#include "apitracecall.h" + +ArgumentsEditor::ArgumentsEditor(QWidget *parent) + : QWidget(parent), + m_model(new QStandardItemModel()), + m_call(0) +{ + init(); +} + +ArgumentsEditor::~ArgumentsEditor() +{ +} + +void ArgumentsEditor::setCall(ApiTraceCall *call) +{ + if (m_call != call) { + m_call = call; + setupCall(); + } +} + +ApiTraceCall * ArgumentsEditor::call() const +{ + return m_call; +} + +void ArgumentsEditor::init() +{ + m_ui.setupUi(this); + + m_ui.argsTree->setModel(m_model); +#if 0 + const QItemEditorFactory *factory = QItemEditorFactory::defaultFactory(); + + QItemEditorCreatorBase *apiBitmaskCreator = + new QStandardItemEditorCreator(); + + factory->registerEditor(QMetaType::type("ApiBitmask") , + apiBitmaskCreator); + + QItemEditorFactory::setDefaultFactory(factory); +#endif +} + +void ArgumentsEditor::setupCall() +{ + m_model->clear(); + + QStringList headers; + headers.append(tr("Argument")); + headers.append(tr("Value")); + m_model->setColumnCount(2); + m_model->setHorizontalHeaderLabels(headers); + m_ui.argsTabWidget->removeTab( + m_ui.argsTabWidget->indexOf(m_ui.shaderTab)); + + if (!m_call) + return; + + m_ui.callLabel->setText(m_call->name); + QStandardItem *rootItem = m_model->invisibleRootItem(); + for (int i = 0; i < m_call->argNames.count(); ++i) { + QString argName = m_call->argNames[i]; + QVariant val = m_call->argValues[i]; + QStandardItem *nameItem = new QStandardItem(argName); + nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable); + QList topRow; + topRow.append(nameItem); + qDebug()<<"arg "<setFlags(col->flags() | Qt::ItemIsEditable); + col->setData(vals[i], Qt::DisplayRole); + row.append(idx); + row.append(col); + nameItem->appendRow(row); + }; + } + qDebug()<<"\tarray first = "<()) { + ApiPointer ptr = val.value(); + QStandardItem *item = new QStandardItem(); + item->setFlags(item->flags() ^ Qt::ItemIsEditable); + item->setText(ptr.toString()); + QIcon icon(":/resources/emblem-locked.png"); + item->setIcon(icon); + item->setToolTip(tr("Argument is read-only")); + topRow.append(item); + } else if (val.canConvert()) { + ApiBitmask mask = val.value(); + QStandardItem *item = new QStandardItem(); + item->setFlags(item->flags() ^ Qt::ItemIsEditable); + item->setText(mask.toString()); + QIcon icon(":/resources/emblem-locked.png"); + item->setIcon(icon); + item->setToolTip(tr("Argument is read-only")); + topRow.append(item); + } else if (val.canConvert()) { + ApiStruct str = val.value(); + QStandardItem *item = new QStandardItem(); + item->setFlags(item->flags() ^ Qt::ItemIsEditable); + item->setText(str.toString()); + QIcon icon(":/resources/emblem-locked.png"); + item->setIcon(icon); + item->setToolTip(tr("Argument is read-only")); + topRow.append(item); + } else if (val.userType() == QVariant::ByteArray) { + QByteArray ba = val.value(); + QStandardItem *item = new QStandardItem(); + item->setFlags(item->flags() ^ Qt::ItemIsEditable); + item->setText( + tr("").arg(ba.size())); + QIcon icon(":/resources/emblem-locked.png"); + item->setIcon(icon); + item->setToolTip(tr("Argument is read-only")); + topRow.append(item); + } else { + QStandardItem *item + = new QStandardItem(); + item->setFlags(item->flags() | Qt::ItemIsEditable); + item->setData(val, Qt::DisplayRole); + topRow.append(item); + } + rootItem->appendRow(topRow); + } +} + +void ArgumentsEditor::setupShaderEditor(const QList &sources) +{ + +} + +#include "argumentseditor.moc" diff --git a/gui/argumentseditor.h b/gui/argumentseditor.h new file mode 100644 index 0000000..bcaefcc --- /dev/null +++ b/gui/argumentseditor.h @@ -0,0 +1,35 @@ +#ifndef ARGUMENTSEDITOR_H +#define ARGUMENTSEDITOR_H + +#include "ui_argumentseditor.h" +#include +#include + +class ApiTraceCall; + +class ArgumentsEditor : public QWidget +{ + Q_OBJECT +public: + ArgumentsEditor(QWidget *parent=0); + ~ArgumentsEditor(); + + + void setCall(ApiTraceCall *call); + ApiTraceCall *call() const; + +signals: + void argumentsEdited(ApiTraceCall *call); + +private: + void init(); + void setupCall(); + void setupShaderEditor(const QList &sources); +private: + Ui_ArgumentsEditor m_ui; + QStandardItemModel *m_model; + + ApiTraceCall *m_call; +}; + +#endif diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index f63b87e..081f0bf 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -5,6 +5,7 @@ #include "apicalldelegate.h" #include "apitracemodel.h" #include "apitracefilter.h" +#include "argumentseditor.h" #include "imageviewer.h" #include "jumpwidget.h" #include "retracer.h" @@ -99,6 +100,7 @@ void MainWindow::callItemSelected(const QModelIndex &index) ApiTraceCall *call = static_cast(event); m_ui.detailsWebView->setHtml(call->toHtml()); m_ui.detailsDock->show(); + m_argsEditor->setCall(call); if (call->hasBinaryData()) { QByteArray data = call->argValues[call->binaryDataIndex()].toByteArray(); @@ -120,6 +122,7 @@ void MainWindow::callItemSelected(const QModelIndex &index) } } } + m_ui.argsEditorDock->show(); m_ui.vertexDataDock->setVisible(call->hasBinaryData()); m_selectedEvent = call; } else { @@ -585,12 +588,17 @@ void MainWindow::initObjects() statusBar()->addPermanentWidget(m_progressBar); m_progressBar->hide(); + m_argsEditor = new ArgumentsEditor(this); + m_ui.argsEditorLayout->addWidget(m_argsEditor); + m_ui.detailsDock->hide(); m_ui.vertexDataDock->hide(); m_ui.stateDock->hide(); + m_ui.argsEditorDock->hide(); setDockOptions(dockOptions() | QMainWindow::ForceTabbedDocks); tabifyDockWidget(m_ui.stateDock, m_ui.vertexDataDock); + tabifyDockWidget(m_ui.vertexDataDock, m_ui.argsEditorDock); m_ui.surfacesTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu); diff --git a/gui/mainwindow.h b/gui/mainwindow.h index de413c0..99f722d 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -12,6 +12,7 @@ class ApiTraceFilter; class ApiTraceFrame; class ApiTraceModel; class ApiTraceState; +class ArgumentsEditor; class ImageViewer; class JumpWidget; class QModelIndex; @@ -91,6 +92,8 @@ private: SearchWidget *m_searchWidget; TraceProcess *m_traceProcess; + + ArgumentsEditor *m_argsEditor; }; diff --git a/gui/qapitrace.qrc b/gui/qapitrace.qrc index a989c42..610eebe 100644 --- a/gui/qapitrace.qrc +++ b/gui/qapitrace.qrc @@ -5,6 +5,8 @@ resources/dialog-information.png resources/document-new.png resources/document-open.png + resources/edit-undo.png + resources/emblem-locked.png resources/go-down-search.png resources/go-up-search.png resources/media-playback-start.png diff --git a/gui/resources/edit-undo.png b/gui/resources/edit-undo.png new file mode 100644 index 0000000..c893a1a Binary files /dev/null and b/gui/resources/edit-undo.png differ diff --git a/gui/resources/emblem-locked.png b/gui/resources/emblem-locked.png new file mode 100644 index 0000000..60024fd Binary files /dev/null and b/gui/resources/emblem-locked.png differ diff --git a/gui/ui/argumentseditor.ui b/gui/ui/argumentseditor.ui new file mode 100644 index 0000000..268e838 --- /dev/null +++ b/gui/ui/argumentseditor.ui @@ -0,0 +1,181 @@ + + + ArgumentsEditor + + + + 0 + 0 + 290 + 472 + + + + Form + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 16 + 50 + false + + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 128 + 20 + + + + + + + + false + + + Revert + + + + :/resources/edit-undo.png:/resources/edit-undo.png + + + + + + + + + 1 + + + + Arguments + + + + + + false + + + + + + + + Shader + + + + + + + + + + + Editable + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Length: + + + + + + + 100 + + + + + + + + + + + + + + + + + + + GLSLEdit + QPlainTextEdit +
glsledit.h
+
+
+ + + + +
diff --git a/gui/ui/mainwindow.ui b/gui/ui/mainwindow.ui index c0c6237..c5f0526 100644 --- a/gui/ui/mainwindow.ui +++ b/gui/ui/mainwindow.ui @@ -364,6 +364,21 @@ + + + Arguments Editor + + + 2 + + + + + + + + + Exit @@ -456,6 +471,7 @@ stateDock vertexDataDock + argsEditorDock