]> git.cworth.org Git - apitrace/commitdiff
Start working on trace editing
authorZack Rusin <zack@kde.org>
Fri, 15 Apr 2011 05:45:05 +0000 (01:45 -0400)
committerZack Rusin <zack@kde.org>
Fri, 15 Apr 2011 05:45:05 +0000 (01:45 -0400)
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

12 files changed:
gui/CMakeLists.txt
gui/apitracecall.cpp
gui/apitracecall.h
gui/argumentseditor.cpp [new file with mode: 0644]
gui/argumentseditor.h [new file with mode: 0644]
gui/mainwindow.cpp
gui/mainwindow.h
gui/qapitrace.qrc
gui/resources/edit-undo.png [new file with mode: 0644]
gui/resources/emblem-locked.png [new file with mode: 0644]
gui/ui/argumentseditor.ui [new file with mode: 0644]
gui/ui/mainwindow.ui

index 6787043cd5c32ea046dad76d06181c212e5b594b..fdc6c1349ab76390a1e9bd5f3fdbd82d88c5f27a 100644 (file)
@@ -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}/..")
 
index 2d28e164cc550d667fed83f645a1473932beb84b..a975728b80a00b8d3fd1f61884063a4b56a525e6 100644 (file)
@@ -532,4 +532,9 @@ QList<ApiFramebuffer> ApiTraceState::framebuffers() const
     return m_framebuffers;
 }
 
+QList<QVariant> ApiArray::values() const
+{
+    return m_array;
+}
+
 
index db5d38d3539bfecc1d0f0570d8bae8ac107e13ff..355b8c8bfe9e94c36b0b8cc1088284d3d2a78a5b 100644 (file)
@@ -91,6 +91,7 @@ public:
 
     QString toString() const;
 
+    QList<QVariant> values() const;
 private:
     void init(const Trace::Array *arr);
 private:
diff --git a/gui/argumentseditor.cpp b/gui/argumentseditor.cpp
new file mode 100644 (file)
index 0000000..8f2b85c
--- /dev/null
@@ -0,0 +1,158 @@
+#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"
diff --git a/gui/argumentseditor.h b/gui/argumentseditor.h
new file mode 100644 (file)
index 0000000..bcaefcc
--- /dev/null
@@ -0,0 +1,35 @@
+#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
index f63b87e0600323632a3612cbc85da8ee628cf881..081f0bfe25baf382d55673cfb7d939c9be3442b8 100644 (file)
@@ -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<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();
@@ -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);
 
index de413c0b689dfb352721e34529c8e0bf401e5bad..99f722d0bccd0a1c18117e795fdf694f52567663 100644 (file)
@@ -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;
 };
 
 
index a989c425506c6ae89b66320a763d59d17e5d9015..610eebeb3faff4bd3aa5a8449c589a132be23365 100644 (file)
@@ -5,6 +5,8 @@
     <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>
diff --git a/gui/resources/edit-undo.png b/gui/resources/edit-undo.png
new file mode 100644 (file)
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 (file)
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 (file)
index 0000000..268e838
--- /dev/null
@@ -0,0 +1,181 @@
+<?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>
index c0c623770b66bebd7fec46569a2af51f23264dd7..c5f05268f287e63fd5a67b1a3211ed93884169d5 100644 (file)
     </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>