]> git.cworth.org Git - apitrace/blob - gui/argumentseditor.cpp
Start working on trace editing
[apitrace] / gui / argumentseditor.cpp
1 #include "argumentseditor.h"
2
3 #include <QDebug>
4 #include <QItemEditorFactory>
5
6 #include "apitracecall.h"
7
8 ArgumentsEditor::ArgumentsEditor(QWidget *parent)
9     : QWidget(parent),
10       m_model(new QStandardItemModel()),
11       m_call(0)
12 {
13     init();
14 }
15
16 ArgumentsEditor::~ArgumentsEditor()
17 {
18 }
19
20 void ArgumentsEditor::setCall(ApiTraceCall *call)
21 {
22     if (m_call != call) {
23         m_call = call;
24         setupCall();
25     }
26 }
27
28 ApiTraceCall * ArgumentsEditor::call() const
29 {
30     return m_call;
31 }
32
33 void ArgumentsEditor::init()
34 {
35     m_ui.setupUi(this);
36
37     m_ui.argsTree->setModel(m_model);
38 #if 0
39     const QItemEditorFactory *factory = QItemEditorFactory::defaultFactory();
40
41     QItemEditorCreatorBase *apiBitmaskCreator =
42         new QStandardItemEditorCreator<ApiBitmaskEditor>();
43
44     factory->registerEditor(QMetaType::type("ApiBitmask") ,
45                             apiBitmaskCreator);
46
47     QItemEditorFactory::setDefaultFactory(factory);
48 #endif
49 }
50
51 void ArgumentsEditor::setupCall()
52 {
53     m_model->clear();
54
55     QStringList headers;
56     headers.append(tr("Argument"));
57     headers.append(tr("Value"));
58     m_model->setColumnCount(2);
59     m_model->setHorizontalHeaderLabels(headers);
60     m_ui.argsTabWidget->removeTab(
61         m_ui.argsTabWidget->indexOf(m_ui.shaderTab));
62
63     if (!m_call)
64         return;
65
66     m_ui.callLabel->setText(m_call->name);
67     QStandardItem *rootItem = m_model->invisibleRootItem();
68     for (int i = 0; i < m_call->argNames.count(); ++i) {
69         QString argName = m_call->argNames[i];
70         QVariant val = m_call->argValues[i];
71         QStandardItem *nameItem = new QStandardItem(argName);
72         nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable);
73         QList<QStandardItem*> topRow;
74         topRow.append(nameItem);
75         qDebug()<<"arg "<<argName<<", val = "<<val;
76
77         if (val.canConvert<ApiArray>()) {
78             ApiArray array = val.value<ApiArray>();
79             QList<QVariant> vals = array.values();
80             QVariant firstVal = vals.value(0);
81
82             if (firstVal.userType() == QVariant::String) {
83                 m_ui.argsTabWidget->addTab(
84                     m_ui.shaderTab, argName);
85                 setupShaderEditor(vals);
86                 delete nameItem;
87                 continue;
88             } else {
89                 for (int i = 0; i < vals.count(); ++i) {
90                     QList<QStandardItem*> row;
91
92                     QStandardItem *idx = new QStandardItem();
93                     idx->setFlags(idx->flags() ^ Qt::ItemIsEditable);
94                     idx->setText(tr("%1)").arg(i));
95
96                     QStandardItem *col = new QStandardItem();
97                     col->setFlags(col->flags() | Qt::ItemIsEditable);
98                     col->setData(vals[i], Qt::DisplayRole);
99                     row.append(idx);
100                     row.append(col);
101                     nameItem->appendRow(row);
102                 };
103             }
104             qDebug()<<"\tarray first = "<<vals[0];
105         } else  if (val.canConvert<ApiPointer>()) {
106             ApiPointer ptr = val.value<ApiPointer>();
107             QStandardItem *item = new QStandardItem();
108             item->setFlags(item->flags() ^ Qt::ItemIsEditable);
109             item->setText(ptr.toString());
110             QIcon icon(":/resources/emblem-locked.png");
111             item->setIcon(icon);
112             item->setToolTip(tr("Argument is read-only"));
113             topRow.append(item);
114         } else if (val.canConvert<ApiBitmask>()) {
115             ApiBitmask mask = val.value<ApiBitmask>();
116             QStandardItem *item = new QStandardItem();
117             item->setFlags(item->flags() ^ Qt::ItemIsEditable);
118             item->setText(mask.toString());
119             QIcon icon(":/resources/emblem-locked.png");
120             item->setIcon(icon);
121             item->setToolTip(tr("Argument is read-only"));
122             topRow.append(item);
123         } else if (val.canConvert<ApiStruct>()) {
124             ApiStruct str = val.value<ApiStruct>();
125             QStandardItem *item = new QStandardItem();
126             item->setFlags(item->flags() ^ Qt::ItemIsEditable);
127             item->setText(str.toString());
128             QIcon icon(":/resources/emblem-locked.png");
129             item->setIcon(icon);
130             item->setToolTip(tr("Argument is read-only"));
131             topRow.append(item);
132         } else if (val.userType() == QVariant::ByteArray) {
133             QByteArray ba = val.value<QByteArray>();
134             QStandardItem *item = new QStandardItem();
135             item->setFlags(item->flags() ^ Qt::ItemIsEditable);
136             item->setText(
137                 tr("<binary data, size = %1 bytes>").arg(ba.size()));
138             QIcon icon(":/resources/emblem-locked.png");
139             item->setIcon(icon);
140             item->setToolTip(tr("Argument is read-only"));
141             topRow.append(item);
142         } else {
143             QStandardItem *item
144                 = new QStandardItem();
145             item->setFlags(item->flags() | Qt::ItemIsEditable);
146             item->setData(val, Qt::DisplayRole);
147             topRow.append(item);
148         }
149         rootItem->appendRow(topRow);
150     }
151 }
152
153 void ArgumentsEditor::setupShaderEditor(const QList<QVariant> &sources)
154 {
155     
156 }
157
158 #include "argumentseditor.moc"