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
apitracecall.cpp
apitracefilter.cpp
apitracemodel.cpp
+ argumentseditor.cpp
glsledit.cpp
imageviewer.cpp
jumpwidget.cpp
qt4_add_resources(qapitrace_SRCS qapitrace.qrc)
set(qapitrace_UIS
+ ui/argumentseditor.ui
ui/imageviewer.ui
ui/jumpwidget.ui
ui/mainwindow.ui
#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}/..")
return m_framebuffers;
}
+QList<QVariant> ApiArray::values() const
+{
+ return m_array;
+}
+
QString toString() const;
+ QList<QVariant> values() const;
private:
void init(const Trace::Array *arr);
private:
--- /dev/null
+#include "argumentseditor.h"
+
+#include <QDebug>
+#include <QItemEditorFactory>
+
+#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<ApiBitmaskEditor>();
+
+ 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<QStandardItem*> topRow;
+ topRow.append(nameItem);
+ qDebug()<<"arg "<<argName<<", val = "<<val;
+
+ if (val.canConvert<ApiArray>()) {
+ ApiArray array = val.value<ApiArray>();
+ QList<QVariant> vals = array.values();
+ QVariant firstVal = vals.value(0);
+
+ if (firstVal.userType() == QVariant::String) {
+ m_ui.argsTabWidget->addTab(
+ m_ui.shaderTab, argName);
+ setupShaderEditor(vals);
+ delete nameItem;
+ continue;
+ } else {
+ for (int i = 0; i < vals.count(); ++i) {
+ QList<QStandardItem*> row;
+
+ QStandardItem *idx = new QStandardItem();
+ idx->setFlags(idx->flags() ^ Qt::ItemIsEditable);
+ idx->setText(tr("%1)").arg(i));
+
+ QStandardItem *col = new QStandardItem();
+ col->setFlags(col->flags() | Qt::ItemIsEditable);
+ col->setData(vals[i], Qt::DisplayRole);
+ row.append(idx);
+ row.append(col);
+ nameItem->appendRow(row);
+ };
+ }
+ qDebug()<<"\tarray first = "<<vals[0];
+ } else if (val.canConvert<ApiPointer>()) {
+ ApiPointer ptr = val.value<ApiPointer>();
+ 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>()) {
+ ApiBitmask mask = val.value<ApiBitmask>();
+ 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>()) {
+ ApiStruct str = val.value<ApiStruct>();
+ 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<QByteArray>();
+ QStandardItem *item = new QStandardItem();
+ item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+ item->setText(
+ tr("<binary data, size = %1 bytes>").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<QVariant> &sources)
+{
+
+}
+
+#include "argumentseditor.moc"
--- /dev/null
+#ifndef ARGUMENTSEDITOR_H
+#define ARGUMENTSEDITOR_H
+
+#include "ui_argumentseditor.h"
+#include <QStandardItemModel>
+#include <QWidget>
+
+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<QVariant> &sources);
+private:
+ Ui_ArgumentsEditor m_ui;
+ QStandardItemModel *m_model;
+
+ ApiTraceCall *m_call;
+};
+
+#endif
#include "apicalldelegate.h"
#include "apitracemodel.h"
#include "apitracefilter.h"
+#include "argumentseditor.h"
#include "imageviewer.h"
#include "jumpwidget.h"
#include "retracer.h"
ApiTraceCall *call = static_cast<ApiTraceCall*>(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();
}
}
}
+ m_ui.argsEditorDock->show();
m_ui.vertexDataDock->setVisible(call->hasBinaryData());
m_selectedEvent = call;
} else {
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);
class ApiTraceFrame;
class ApiTraceModel;
class ApiTraceState;
+class ArgumentsEditor;
class ImageViewer;
class JumpWidget;
class QModelIndex;
SearchWidget *m_searchWidget;
TraceProcess *m_traceProcess;
+
+ ArgumentsEditor *m_argsEditor;
};
<file>resources/dialog-information.png</file>
<file>resources/document-new.png</file>
<file>resources/document-open.png</file>
+ <file>resources/edit-undo.png</file>
+ <file>resources/emblem-locked.png</file>
<file>resources/go-down-search.png</file>
<file>resources/go-up-search.png</file>
<file>resources/media-playback-start.png</file>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ArgumentsEditor</class>
+ <widget class="QWidget" name="ArgumentsEditor">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>290</width>
+ <height>472</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="callLabel">
+ <property name="font">
+ <font>
+ <pointsize>16</pointsize>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>128</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="revertButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Revert</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../qapitrace.qrc">
+ <normaloff>:/resources/edit-undo.png</normaloff>:/resources/edit-undo.png</iconset>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="argsTabWidget">
+ <property name="currentIndex">
+ <number>1</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Arguments</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTreeView" name="argsTree">
+ <attribute name="headerVisible">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="shaderTab">
+ <attribute name="title">
+ <string>Shader</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QComboBox" name="selectStringCB"/>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="editableBox">
+ <property name="text">
+ <string>Editable</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Length:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="lengthLabel">
+ <property name="text">
+ <string>100</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="GLSLEdit" name="glslEdit"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>GLSLEdit</class>
+ <extends>QPlainTextEdit</extends>
+ <header>glsledit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources>
+ <include location="../qapitrace.qrc"/>
+ </resources>
+ <connections/>
+</ui>
</layout>
</widget>
</widget>
+ <widget class="QDockWidget" name="argsEditorDock">
+ <property name="windowTitle">
+ <string>Arguments Editor</string>
+ </property>
+ <attribute name="dockWidgetArea">
+ <number>2</number>
+ </attribute>
+ <widget class="QWidget" name="dockWidgetContents_4">
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <layout class="QVBoxLayout" name="argsEditorLayout"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
<action name="actionExit">
<property name="text">
<string>Exit</string>
</action>
<zorder>stateDock</zorder>
<zorder>vertexDataDock</zorder>
+ <zorder>argsEditorDock</zorder>
</widget>
<customwidgets>
<customwidget>