blob: 6075df0430ca2e1d77d85d9f9b89f8518e43c338 [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
chudy@google.com902ebe52012-06-29 14:21:22 +00008#include "SkDebuggerGUI.h"
chudy@google.combbad34d2012-08-13 14:26:36 +00009#include "SkGraphics.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000010#include <QListWidgetItem>
11
12SkDebuggerGUI::SkDebuggerGUI(QWidget *parent) :
chudy@google.comc432f002012-07-10 13:19:25 +000013 QMainWindow(parent)
chudy@google.com2d537a12012-07-31 12:49:52 +000014 , fCentralWidget(this)
15 , fStatusBar(this)
16 , fToolBar(this)
chudy@google.comc432f002012-07-10 13:19:25 +000017 , fActionOpen(this)
18 , fActionBreakpoint(this)
19 , fActionCancel(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000020 , fActionClearBreakpoints(this)
chudy@google.come504de02012-07-16 18:35:23 +000021 , fActionClearDeletes(this)
chudy@google.comc432f002012-07-10 13:19:25 +000022 , fActionClose(this)
chudy@google.come504de02012-07-16 18:35:23 +000023 , fActionCreateBreakpoint(this)
chudy@google.comc432f002012-07-10 13:19:25 +000024 , fActionDelete(this)
25 , fActionDirectory(this)
26 , fActionGoToLine(this)
27 , fActionInspector(this)
28 , fActionPlay(this)
chudy@google.come504de02012-07-16 18:35:23 +000029 , fActionPause(this)
chudy@google.comc432f002012-07-10 13:19:25 +000030 , fActionRewind(this)
chudy@google.com0ab03392012-07-28 20:16:11 +000031 , fActionSave(this)
32 , fActionSaveAs(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000033 , fActionShowDeletes(this)
chudy@google.comc432f002012-07-10 13:19:25 +000034 , fActionStepBack(this)
35 , fActionStepForward(this)
chudy@google.coma1226312012-07-26 20:26:44 +000036 , fActionZoomIn(this)
37 , fActionZoomOut(this)
38 , fMapper(this)
chudy@google.comc432f002012-07-10 13:19:25 +000039 , fListWidget(&fCentralWidget)
40 , fDirectoryWidget(&fCentralWidget)
chudy@google.com607357f2012-08-07 16:12:23 +000041 , fCanvasWidget(this, &fDebugger)
chudy@google.comc432f002012-07-10 13:19:25 +000042 , fMenuBar(this)
43 , fMenuFile(this)
44 , fMenuNavigate(this)
45 , fMenuView(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000046 , fBreakpointsActivated(false)
47 , fDeletesActivated(false)
48 , fPause(false)
chudy@google.comd3058f52012-07-19 13:41:27 +000049 , fLoading(false)
chudy@google.comc432f002012-07-10 13:19:25 +000050{
chudy@google.com902ebe52012-06-29 14:21:22 +000051 setupUi(this);
chudy@google.comea5488b2012-07-26 19:38:22 +000052 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000053 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
chudy@google.comea5488b2012-07-26 19:38:22 +000054 connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()));
55 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000056 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
chudy@google.comea5488b2012-07-26 19:38:22 +000057 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint()));
chudy@google.comc432f002012-07-10 13:19:25 +000058 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
59 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
60 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
chudy@google.comea5488b2012-07-26 19:38:22 +000061 connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward()));
62 connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints()));
63 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()));
64 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionSettings()));
65 connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString)));
chudy@google.comc432f002012-07-10 13:19:25 +000066 connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000067 connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
68 connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
chudy@google.comc432f002012-07-10 13:19:25 +000069 connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
chudy@google.comea5488b2012-07-26 19:38:22 +000070 connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this, SLOT(actionCommandFilter()));
71 connect(fSettingsWidget.getGLCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionGLWidget(bool)));
72 connect(fSettingsWidget.getRasterCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionRasterWidget(bool)));
73 connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool)));
chudy@google.come504de02012-07-16 18:35:23 +000074 connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000075 connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
chudy@google.comea5488b2012-07-26 19:38:22 +000076 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
77 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int)));
78 connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float)));
79 connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int)));
chudy@google.com0ab03392012-07-28 20:16:11 +000080 connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs()));
81 connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000082
chudy@google.coma1226312012-07-26 20:26:44 +000083 fMapper.setMapping(&fActionZoomIn, 1);
84 fMapper.setMapping(&fActionZoomOut, -1);
85
86 connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map()));
87 connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map()));
88 connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(keyZoom(int)));
89
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000090 fInspectorWidget.setDisabled(true);
chudy@google.comd3058f52012-07-19 13:41:27 +000091 fMenuEdit.setDisabled(true);
92 fMenuNavigate.setDisabled(true);
93 fMenuView.setDisabled(true);
chudy@google.combbad34d2012-08-13 14:26:36 +000094
95 SkGraphics::Init();
chudy@google.com902ebe52012-06-29 14:21:22 +000096}
97
chudy@google.combbad34d2012-08-13 14:26:36 +000098SkDebuggerGUI::~SkDebuggerGUI() {
99 SkGraphics::Term();
100}
chudy@google.com902ebe52012-06-29 14:21:22 +0000101
102void SkDebuggerGUI::actionBreakpoints() {
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000103 fBreakpointsActivated = !fBreakpointsActivated;
chudy@google.comc432f002012-07-10 13:19:25 +0000104 for (int row = 0; row < fListWidget.count(); row++) {
105 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000106 item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated);
107 }
108}
chudy@google.com902ebe52012-06-29 14:21:22 +0000109
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000110void SkDebuggerGUI::showDeletes() {
111 fDeletesActivated = !fDeletesActivated;
112 for (int row = 0; row < fListWidget.count(); row++) {
113 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com607357f2012-08-07 16:12:23 +0000114 item->setHidden(fDebugger.isCommandVisible(row)
115 && fDeletesActivated);
chudy@google.com902ebe52012-06-29 14:21:22 +0000116 }
117}
118
119void SkDebuggerGUI::actionCancel() {
chudy@google.comc432f002012-07-10 13:19:25 +0000120 for (int row = 0; row < fListWidget.count(); row++) {
121 fListWidget.item(row)->setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000122 }
123}
124
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000125void SkDebuggerGUI::actionClearBreakpoints() {
126 for (int row = 0; row < fListWidget.count(); row++) {
127 QListWidgetItem* item = fListWidget.item(row);
128 item->setCheckState(Qt::Unchecked);
129 item->setData(Qt::DecorationRole,
130 QPixmap(":/images/Icons/blank.png"));
131 }
132}
133
134void SkDebuggerGUI::actionClearDeletes() {
135 for (int row = 0; row < fListWidget.count(); row++) {
136 QListWidgetItem* item = fListWidget.item(row);
137 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
chudy@google.com607357f2012-08-07 16:12:23 +0000138 fDebugger.setCommandVisible(row, true);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000139 }
140 if (fPause) {
141 fCanvasWidget.drawTo(fPausedRow);
142 } else {
143 fCanvasWidget.drawTo(fListWidget.currentRow());
144 }
145}
146
chudy@google.com902ebe52012-06-29 14:21:22 +0000147void SkDebuggerGUI::actionCommandFilter() {
chudy@google.com607357f2012-08-07 16:12:23 +0000148 fDebugger.highlightCurrentCommand(
chudy@google.comc432f002012-07-10 13:19:25 +0000149 fSettingsWidget.getVisibilityButton()->isChecked());
150 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com902ebe52012-06-29 14:21:22 +0000151}
152
153void SkDebuggerGUI::actionClose() {
154 this->close();
155}
156
157void SkDebuggerGUI::actionDelete() {
chudy@google.comc432f002012-07-10 13:19:25 +0000158 int currentRow = fListWidget.currentRow();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000159 QListWidgetItem* item = fListWidget.currentItem();
160
chudy@google.com607357f2012-08-07 16:12:23 +0000161 if (fDebugger.isCommandVisible(currentRow)) {
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000162 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/delete.png"));
chudy@google.com607357f2012-08-07 16:12:23 +0000163 fDebugger.setCommandVisible(currentRow, false);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000164 } else {
165 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
chudy@google.com607357f2012-08-07 16:12:23 +0000166 fDebugger.setCommandVisible(currentRow, true);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000167 }
168
chudy@google.come504de02012-07-16 18:35:23 +0000169 if (fPause) {
170 fCanvasWidget.drawTo(fPausedRow);
171 } else {
172 fCanvasWidget.drawTo(currentRow);
173 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000174}
175
chudy@google.comea5488b2012-07-26 19:38:22 +0000176void SkDebuggerGUI::actionGLWidget(bool isToggled) {
177 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled);
178}
179
chudy@google.com902ebe52012-06-29 14:21:22 +0000180void SkDebuggerGUI::actionInspector() {
chudy@google.comc432f002012-07-10 13:19:25 +0000181 if (fInspectorWidget.isHidden()) {
182 fInspectorWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000183 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000184 fInspectorWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000185 }
186}
187
188void SkDebuggerGUI::actionPlay() {
chudy@google.comc432f002012-07-10 13:19:25 +0000189 for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
chudy@google.com7dcae672012-07-09 20:26:53 +0000190 row++) {
chudy@google.comc432f002012-07-10 13:19:25 +0000191 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000192 if (item->checkState() == Qt::Checked) {
chudy@google.comc432f002012-07-10 13:19:25 +0000193 fListWidget.setCurrentItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000194 return;
195 }
196 }
chudy@google.comc432f002012-07-10 13:19:25 +0000197 fListWidget.setCurrentRow(fListWidget.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000198}
199
chudy@google.comea5488b2012-07-26 19:38:22 +0000200void SkDebuggerGUI::actionRasterWidget(bool isToggled) {
201 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, !isToggled);
202}
203
chudy@google.com902ebe52012-06-29 14:21:22 +0000204void SkDebuggerGUI::actionRewind() {
chudy@google.come504de02012-07-16 18:35:23 +0000205 fListWidget.setCurrentRow(0);
chudy@google.com902ebe52012-06-29 14:21:22 +0000206}
207
chudy@google.com0ab03392012-07-28 20:16:11 +0000208void SkDebuggerGUI::actionSave() {
209 QString filename;
210 filename.append(fPath);
211 filename.append("/");
212 filename.append(fDirectoryWidget.currentItem()->text());
213 saveToFile(filename);
214}
215
216void SkDebuggerGUI::actionSaveAs() {
217 QString filename = QFileDialog::getSaveFileName(this, "Save File", "",
218 "Skia Picture (*skp)");
chudy@google.com38b08ce2012-07-28 23:26:10 +0000219 if (!filename.endsWith(".skp", Qt::CaseInsensitive)) {
chudy@google.com0ab03392012-07-28 20:16:11 +0000220 filename.append(".skp");
221 }
222 saveToFile(filename);
223}
224
chudy@google.com7dcae672012-07-09 20:26:53 +0000225void SkDebuggerGUI::actionScale(float scaleFactor) {
chudy@google.comc432f002012-07-10 13:19:25 +0000226 fSettingsWidget.setZoomText(scaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000227}
228
chudy@google.com902ebe52012-06-29 14:21:22 +0000229void SkDebuggerGUI::actionSettings() {
chudy@google.comc432f002012-07-10 13:19:25 +0000230 if (fSettingsWidget.isHidden()) {
231 fSettingsWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000232 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000233 fSettingsWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000234 }
235}
236
237void SkDebuggerGUI::actionStepBack() {
chudy@google.comc432f002012-07-10 13:19:25 +0000238 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000239 if (currentRow != 0) {
chudy@google.comc432f002012-07-10 13:19:25 +0000240 fListWidget.setCurrentRow(currentRow - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000241 }
242}
243
244void SkDebuggerGUI::actionStepForward() {
chudy@google.comc432f002012-07-10 13:19:25 +0000245 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000246 QString curRow = QString::number(currentRow);
chudy@google.comc432f002012-07-10 13:19:25 +0000247 QString curCount = QString::number(fListWidget.count());
248 if (currentRow < fListWidget.count() - 1) {
249 fListWidget.setCurrentRow(currentRow + 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000250 }
251}
252
chudy@google.coma9e937c2012-08-03 17:32:05 +0000253void SkDebuggerGUI::drawComplete() {
chudy@google.com607357f2012-08-07 16:12:23 +0000254 fInspectorWidget.setMatrix(fDebugger.getCurrentMatrix());
255 fInspectorWidget.setClip(fDebugger.getCurrentClip());
chudy@google.coma9e937c2012-08-03 17:32:05 +0000256}
257
chudy@google.com0ab03392012-07-28 20:16:11 +0000258void SkDebuggerGUI::saveToFile(QString filename) {
259 SkFILEWStream file(filename.toAscii());
chudy@google.com607357f2012-08-07 16:12:23 +0000260 fDebugger.makePicture()->serialize(&file);
chudy@google.com0ab03392012-07-28 20:16:11 +0000261}
262
chudy@google.com902ebe52012-06-29 14:21:22 +0000263void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
264 if (fDirectoryWidgetActive) {
265 QString fileName;
266 fileName.append(fPath);
267 fileName.append("/");
268 fileName.append(item->text());
269 loadPicture(fileName);
270 }
271}
272
273void SkDebuggerGUI::openFile() {
chudy@google.com7dcae672012-07-09 20:26:53 +0000274 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
275 tr("Files (*.*)"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000276 fDirectoryWidgetActive = false;
277 if (!fileName.isNull()) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000278 QFileInfo pathInfo(fileName);
279 fPath = pathInfo.path();
280 loadPicture(fileName);
281 setupDirectoryWidget();
282 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000283 fDirectoryWidgetActive = true;
284}
285
chudy@google.comc432f002012-07-10 13:19:25 +0000286void SkDebuggerGUI::pauseDrawing(bool isPaused) {
chudy@google.com607357f2012-08-07 16:12:23 +0000287 fPause = isPaused;
288 fPausedRow = fListWidget.currentRow();
289 fCanvasWidget.drawTo(fPausedRow);
chudy@google.com7dcae672012-07-09 20:26:53 +0000290}
291
chudy@google.com902ebe52012-06-29 14:21:22 +0000292void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000293 if(!fLoading) {
294 int currentRow = fListWidget.currentRow();
chudy@google.comd3058f52012-07-19 13:41:27 +0000295
chudy@google.comea5488b2012-07-26 19:38:22 +0000296 if (currentRow != -1) {
297 if (!fPause) {
298 fCanvasWidget.drawTo(currentRow);
chudy@google.comd3058f52012-07-19 13:41:27 +0000299 }
chudy@google.com97cee972012-08-07 20:41:37 +0000300 SkTDArray<SkString*> *currInfo = fDebugger.getCommandInfo(
chudy@google.comea5488b2012-07-26 19:38:22 +0000301 currentRow);
302
303 /* TODO(chudy): Add command type before parameters. Rename v
304 * to something more informative. */
chudy@google.com97cee972012-08-07 20:41:37 +0000305 if (currInfo) {
chudy@google.comea5488b2012-07-26 19:38:22 +0000306 QString info;
307 info.append("<b>Parameters: </b><br/>");
chudy@google.com97cee972012-08-07 20:41:37 +0000308 for (int i = 0; i < currInfo->count(); i++) {
309
310 info.append(QString((*currInfo)[i]->c_str()));
chudy@google.comea5488b2012-07-26 19:38:22 +0000311 info.append("<br/>");
312 }
313 fInspectorWidget.setDetailText(info);
314 fInspectorWidget.setDisabled(false);
chudy@google.comea5488b2012-07-26 19:38:22 +0000315 }
chudy@google.comd3058f52012-07-19 13:41:27 +0000316 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000317
chudy@google.com902ebe52012-06-29 14:21:22 +0000318 }
319}
320
chudy@google.com9ca9bfe2012-07-12 21:58:14 +0000321void SkDebuggerGUI::selectCommand(int command) {
322 if (fPause) {
323 fListWidget.setCurrentRow(command);
324 }
325}
326
chudy@google.com902ebe52012-06-29 14:21:22 +0000327void SkDebuggerGUI::toggleBreakpoint() {
chudy@google.comc432f002012-07-10 13:19:25 +0000328 QListWidgetItem* item = fListWidget.currentItem();
chudy@google.com902ebe52012-06-29 14:21:22 +0000329 if (item->checkState() == Qt::Unchecked) {
330 item->setCheckState(Qt::Checked);
chudy@google.come565de42012-07-12 14:15:54 +0000331 item->setData(Qt::DecorationRole,
332 QPixmap(":/images/Icons/breakpoint_16x16.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000333 } else {
chudy@google.com902ebe52012-06-29 14:21:22 +0000334 item->setCheckState(Qt::Unchecked);
chudy@google.come565de42012-07-12 14:15:54 +0000335 item->setData(Qt::DecorationRole,
336 QPixmap(":/images/Icons/blank.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000337 }
338}
339
340void SkDebuggerGUI::toggleDirectory() {
chudy@google.com607357f2012-08-07 16:12:23 +0000341 fDirectoryWidget.setHidden(!fDirectoryWidget.isHidden());
chudy@google.com902ebe52012-06-29 14:21:22 +0000342}
343
344void SkDebuggerGUI::toggleFilter(QString string) {
chudy@google.comc432f002012-07-10 13:19:25 +0000345 for (int row = 0; row < fListWidget.count(); row++) {
346 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com607357f2012-08-07 16:12:23 +0000347 item->setHidden(item->text() != string);
chudy@google.com902ebe52012-06-29 14:21:22 +0000348 }
349}
350
351void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
352 QIcon windowIcon;
chudy@google.com7dcae672012-07-09 20:26:53 +0000353 windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(),
354 QIcon::Normal, QIcon::Off);
chudy@google.com902ebe52012-06-29 14:21:22 +0000355 SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
356 SkDebuggerGUI->resize(1200, 1000);
357 SkDebuggerGUI->setWindowIcon(windowIcon);
chudy@google.comc432f002012-07-10 13:19:25 +0000358 SkDebuggerGUI->setWindowTitle("Skia Debugger");
chudy@google.com902ebe52012-06-29 14:21:22 +0000359
chudy@google.come504de02012-07-16 18:35:23 +0000360 fActionOpen.setShortcuts(QKeySequence::Open);
chudy@google.comc432f002012-07-10 13:19:25 +0000361 fActionOpen.setText("Open");
chudy@google.com902ebe52012-06-29 14:21:22 +0000362
363 QIcon breakpoint;
chudy@google.com7dcae672012-07-09 20:26:53 +0000364 breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"),
365 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000366 fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
chudy@google.comc432f002012-07-10 13:19:25 +0000367 fActionBreakpoint.setIcon(breakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000368 fActionBreakpoint.setText("Breakpoints");
chudy@google.com902ebe52012-06-29 14:21:22 +0000369
370 QIcon cancel;
chudy@google.come504de02012-07-16 18:35:23 +0000371 cancel.addFile(QString::fromUtf8(":/images/Ico/reload.png"), QSize(),
chudy@google.com7dcae672012-07-09 20:26:53 +0000372 QIcon::Normal, QIcon::Off);
chudy@google.comc432f002012-07-10 13:19:25 +0000373 fActionCancel.setIcon(cancel);
374 fActionCancel.setText("Clear Filter");
chudy@google.com902ebe52012-06-29 14:21:22 +0000375
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000376 fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
377 fActionClearBreakpoints.setText("Clear Breakpoints");
378
379 fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
380 fActionClearDeletes.setText("Clear Deletes");
381
chudy@google.come504de02012-07-16 18:35:23 +0000382 fActionClose.setShortcuts(QKeySequence::Quit);
chudy@google.comc432f002012-07-10 13:19:25 +0000383 fActionClose.setText("Exit");
chudy@google.com902ebe52012-06-29 14:21:22 +0000384
chudy@google.come504de02012-07-16 18:35:23 +0000385 fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
386 fActionCreateBreakpoint.setText("Set Breakpoint");
387
388 fActionDelete.setShortcut(QKeySequence(tr("X")));
chudy@google.comc432f002012-07-10 13:19:25 +0000389 fActionDelete.setText("Delete Command");
chudy@google.com902ebe52012-06-29 14:21:22 +0000390
chudy@google.come504de02012-07-16 18:35:23 +0000391 fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
392 fActionDirectory.setText("Directory");
chudy@google.com902ebe52012-06-29 14:21:22 +0000393
chudy@google.comc432f002012-07-10 13:19:25 +0000394 QIcon inspector;
chudy@google.come504de02012-07-16 18:35:23 +0000395 inspector.addFile(QString::fromUtf8(":/images/Ico/inspector.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000396 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000397 fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
chudy@google.comc432f002012-07-10 13:19:25 +0000398 fActionInspector.setIcon(inspector);
chudy@google.come504de02012-07-16 18:35:23 +0000399 fActionInspector.setText("Inspector");
chudy@google.com902ebe52012-06-29 14:21:22 +0000400
chudy@google.comc432f002012-07-10 13:19:25 +0000401 QIcon play;
chudy@google.come504de02012-07-16 18:35:23 +0000402 play.addFile(QString::fromUtf8(":/images/Ico/play.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000403 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000404 fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
chudy@google.comc432f002012-07-10 13:19:25 +0000405 fActionPlay.setIcon(play);
406 fActionPlay.setText("Play");
chudy@google.com902ebe52012-06-29 14:21:22 +0000407
chudy@google.come504de02012-07-16 18:35:23 +0000408 QIcon pause;
409 pause.addFile(QString::fromUtf8(":/images/Ico/pause.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000410 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000411 fActionPause.setShortcut(QKeySequence(tr("Space")));
412 fActionPause.setCheckable(true);
413 fActionPause.setIcon(pause);
414 fActionPause.setText("Pause");
415
chudy@google.comc432f002012-07-10 13:19:25 +0000416 QIcon rewind;
chudy@google.come504de02012-07-16 18:35:23 +0000417 rewind.addFile(QString::fromUtf8(":/images/Ico/rewind.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000418 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000419 fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
chudy@google.comc432f002012-07-10 13:19:25 +0000420 fActionRewind.setIcon(rewind);
421 fActionRewind.setText("Rewind");
chudy@google.com902ebe52012-06-29 14:21:22 +0000422
chudy@google.com0ab03392012-07-28 20:16:11 +0000423 fActionSave.setShortcut(QKeySequence::Save);
424 fActionSave.setText("Save");
425 fActionSave.setDisabled(true);
426 fActionSaveAs.setShortcut(QKeySequence::SaveAs);
427 fActionSaveAs.setText("Save As");
428 fActionSaveAs.setDisabled(true);
429
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000430 fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
431 fActionShowDeletes.setText("Deleted Commands");
432
chudy@google.comc432f002012-07-10 13:19:25 +0000433 QIcon stepBack;
chudy@google.come504de02012-07-16 18:35:23 +0000434 stepBack.addFile(QString::fromUtf8(":/images/Ico/previous.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000435 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000436 fActionStepBack.setShortcut(QKeySequence(tr("[")));
chudy@google.comc432f002012-07-10 13:19:25 +0000437 fActionStepBack.setIcon(stepBack);
438 fActionStepBack.setText("Step Back");
chudy@google.com902ebe52012-06-29 14:21:22 +0000439
chudy@google.comc432f002012-07-10 13:19:25 +0000440 QIcon stepForward;
chudy@google.come504de02012-07-16 18:35:23 +0000441 stepForward.addFile(QString::fromUtf8(":/images/Ico/next.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000442 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000443 fActionStepForward.setShortcut(QKeySequence(tr("]")));
chudy@google.comc432f002012-07-10 13:19:25 +0000444 fActionStepForward.setIcon(stepForward);
445 fActionStepForward.setText("Step Forward");
446
chudy@google.coma1226312012-07-26 20:26:44 +0000447 fActionZoomIn.setShortcut(QKeySequence(tr("Ctrl+=")));
448 fActionZoomIn.setText("Zoom In");
449 fActionZoomOut.setShortcut(QKeySequence(tr("Ctrl+-")));
450 fActionZoomOut.setText("Zoom Out");
451
chudy@google.comc432f002012-07-10 13:19:25 +0000452 fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
453 fListWidget.setObjectName(QString::fromUtf8("listWidget"));
454 fListWidget.setMaximumWidth(250);
455
456 fFilter.addItem("--Filter By Available Commands--");
457
458 fDirectoryWidget.setMaximumWidth(250);
459 fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
460
461 fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000462 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000463
chudy@google.comc432f002012-07-10 13:19:25 +0000464 fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000465 QSizePolicy::Expanding);
chudy@google.comc432f002012-07-10 13:19:25 +0000466 fInspectorWidget.setMaximumHeight(300);
chudy@google.com902ebe52012-06-29 14:21:22 +0000467
chudy@google.comc432f002012-07-10 13:19:25 +0000468 fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
469 QSizePolicy::Expanding);
470 fSettingsWidget.setMaximumWidth(250);
chudy@google.com902ebe52012-06-29 14:21:22 +0000471
chudy@google.comc432f002012-07-10 13:19:25 +0000472 fLeftColumnLayout.setSpacing(6);
473 fLeftColumnLayout.addWidget(&fListWidget);
474 fLeftColumnLayout.addWidget(&fDirectoryWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000475
chudy@google.comc432f002012-07-10 13:19:25 +0000476 fCanvasAndSettingsLayout.setSpacing(6);
477 fCanvasAndSettingsLayout.addWidget(&fCanvasWidget);
478 fCanvasAndSettingsLayout.addWidget(&fSettingsWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000479
chudy@google.comc432f002012-07-10 13:19:25 +0000480 fMainAndRightColumnLayout.setSpacing(6);
481 fMainAndRightColumnLayout.addLayout(&fCanvasAndSettingsLayout);
482 fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000483
chudy@google.com2d537a12012-07-31 12:49:52 +0000484 fCentralWidget.setLayout(&fContainerLayout);
chudy@google.comc432f002012-07-10 13:19:25 +0000485 fContainerLayout.setSpacing(6);
486 fContainerLayout.setContentsMargins(11, 11, 11, 11);
487 fContainerLayout.addLayout(&fLeftColumnLayout);
488 fContainerLayout.addLayout(&fMainAndRightColumnLayout);
489
490 SkDebuggerGUI->setCentralWidget(&fCentralWidget);
491 SkDebuggerGUI->setStatusBar(&fStatusBar);
492
chudy@google.come504de02012-07-16 18:35:23 +0000493 fToolBar.setIconSize(QSize(32, 32));
chudy@google.comc432f002012-07-10 13:19:25 +0000494 fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
495 SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000496
chudy@google.com0ab03392012-07-28 20:16:11 +0000497 fSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000498
chudy@google.comc432f002012-07-10 13:19:25 +0000499 fToolBar.addAction(&fActionRewind);
500 fToolBar.addAction(&fActionStepBack);
chudy@google.come504de02012-07-16 18:35:23 +0000501 fToolBar.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000502 fToolBar.addAction(&fActionStepForward);
503 fToolBar.addAction(&fActionPlay);
504 fToolBar.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000505 fToolBar.addAction(&fActionInspector);
chudy@google.comc432f002012-07-10 13:19:25 +0000506 fToolBar.addSeparator();
chudy@google.com0ab03392012-07-28 20:16:11 +0000507 fToolBar.addWidget(&fSpacer);
chudy@google.comc432f002012-07-10 13:19:25 +0000508 fToolBar.addWidget(&fFilter);
509 fToolBar.addAction(&fActionCancel);
chudy@google.com902ebe52012-06-29 14:21:22 +0000510
511 // TODO(chudy): Remove static call.
512 fDirectoryWidgetActive = false;
chudy@google.comea5488b2012-07-26 19:38:22 +0000513 fPath = "/usr/local/google/home/chudy/trunk-git/trunk/skp";
chudy@google.com902ebe52012-06-29 14:21:22 +0000514 setupDirectoryWidget();
515 fDirectoryWidgetActive = true;
516
chudy@google.com902ebe52012-06-29 14:21:22 +0000517 // Menu Bar
chudy@google.comc432f002012-07-10 13:19:25 +0000518 fMenuFile.setTitle("File");
519 fMenuFile.addAction(&fActionOpen);
chudy@google.com0ab03392012-07-28 20:16:11 +0000520 fMenuFile.addAction(&fActionSave);
521 fMenuFile.addAction(&fActionSaveAs);
chudy@google.comc432f002012-07-10 13:19:25 +0000522 fMenuFile.addAction(&fActionClose);
chudy@google.come504de02012-07-16 18:35:23 +0000523
524 fMenuEdit.setTitle("Edit");
525 fMenuEdit.addAction(&fActionDelete);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000526 fMenuEdit.addAction(&fActionClearDeletes);
527 fMenuEdit.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000528 fMenuEdit.addAction(&fActionCreateBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000529 fMenuEdit.addAction(&fActionClearBreakpoints);
chudy@google.come504de02012-07-16 18:35:23 +0000530
chudy@google.comc432f002012-07-10 13:19:25 +0000531 fMenuNavigate.setTitle("Navigate");
chudy@google.come504de02012-07-16 18:35:23 +0000532 fMenuNavigate.addAction(&fActionRewind);
533 fMenuNavigate.addAction(&fActionStepBack);
534 fMenuNavigate.addAction(&fActionStepForward);
535 fMenuNavigate.addAction(&fActionPlay);
536 fMenuNavigate.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000537 fMenuNavigate.addAction(&fActionGoToLine);
chudy@google.come504de02012-07-16 18:35:23 +0000538
chudy@google.comc432f002012-07-10 13:19:25 +0000539 fMenuView.setTitle("View");
chudy@google.come504de02012-07-16 18:35:23 +0000540 fMenuView.addAction(&fActionBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000541 fMenuView.addAction(&fActionShowDeletes);
chudy@google.coma1226312012-07-26 20:26:44 +0000542 fMenuView.addAction(&fActionZoomIn);
543 fMenuView.addAction(&fActionZoomOut);
chudy@google.come504de02012-07-16 18:35:23 +0000544
545 fMenuWindows.setTitle("Window");
546 fMenuWindows.addAction(&fActionInspector);
547 fMenuWindows.addAction(&fActionDirectory);
chudy@google.comc432f002012-07-10 13:19:25 +0000548
549 fActionGoToLine.setText("Go to Line...");
550 fActionGoToLine.setDisabled(true);
551 fMenuBar.addAction(fMenuFile.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000552 fMenuBar.addAction(fMenuEdit.menuAction());
chudy@google.comc432f002012-07-10 13:19:25 +0000553 fMenuBar.addAction(fMenuView.menuAction());
554 fMenuBar.addAction(fMenuNavigate.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000555 fMenuBar.addAction(fMenuWindows.menuAction());
chudy@google.com902ebe52012-06-29 14:21:22 +0000556
chudy@google.com7dcae672012-07-09 20:26:53 +0000557 fPause = false;
558
chudy@google.comc432f002012-07-10 13:19:25 +0000559 SkDebuggerGUI->setMenuBar(&fMenuBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000560 QMetaObject::connectSlotsByName(SkDebuggerGUI);
561}
562
563void SkDebuggerGUI::setupDirectoryWidget() {
chudy@google.comc432f002012-07-10 13:19:25 +0000564 QDir dir(fPath);
chudy@google.com902ebe52012-06-29 14:21:22 +0000565 QRegExp r(".skp");
chudy@google.comc432f002012-07-10 13:19:25 +0000566 fDirectoryWidget.clear();
567 const QStringList files = dir.entryList();
chudy@google.com902ebe52012-06-29 14:21:22 +0000568 foreach (QString f, files) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000569 if (f.contains(r))
chudy@google.comc432f002012-07-10 13:19:25 +0000570 fDirectoryWidget.addItem(f);
chudy@google.com902ebe52012-06-29 14:21:22 +0000571 }
572}
573
chudy@google.com902ebe52012-06-29 14:21:22 +0000574void SkDebuggerGUI::loadPicture(QString fileName) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000575 fLoading = true;
chudy@google.com607357f2012-08-07 16:12:23 +0000576 SkStream* stream = new SkFILEStream(fileName.toAscii());
577 SkPicture* picture = new SkPicture(stream);
chudy@google.com686e6802012-08-14 16:00:32 +0000578 fCanvasWidget.resetWidgetTransform();
chudy@google.com607357f2012-08-07 16:12:23 +0000579 fDebugger.loadPicture(picture);
chudy@google.com686e6802012-08-14 16:00:32 +0000580 fCanvasWidget.drawTo(fDebugger.index());
chudy@google.com607357f2012-08-07 16:12:23 +0000581 SkSafeUnref(stream);
582 SkSafeUnref(picture);
583
chudy@google.com97cee972012-08-07 20:41:37 +0000584 // Will this automatically clear out due to nature of refcnt?
585 SkTDArray<SkString*>* commands = fDebugger.getDrawCommands();
chudy@google.com607357f2012-08-07 16:12:23 +0000586
chudy@google.com7dcae672012-07-09 20:26:53 +0000587 /* fDebugCanvas is reinitialized every load picture. Need it to retain value
chudy@google.com607357f2012-08-07 16:12:23 +0000588 * of the visibility filter.
589 * TODO(chudy): This should be deprecated since fDebugger is not
590 * recreated.
591 * */
592 fDebugger.highlightCurrentCommand(fSettingsWidget.getVisibilityButton()->isChecked());
593
chudy@google.com97cee972012-08-07 20:41:37 +0000594 setupListWidget(commands);
595 setupComboBox(commands);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000596 fInspectorWidget.setDisabled(false);
chudy@google.come606d6e2012-07-12 14:31:25 +0000597 fSettingsWidget.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000598 fMenuEdit.setDisabled(false);
599 fMenuNavigate.setDisabled(false);
600 fMenuView.setDisabled(false);
chudy@google.com0ab03392012-07-28 20:16:11 +0000601 fActionSave.setDisabled(false);
602 fActionSaveAs.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000603 fLoading = false;
604 actionPlay();
chudy@google.com902ebe52012-06-29 14:21:22 +0000605}
606
chudy@google.com97cee972012-08-07 20:41:37 +0000607void SkDebuggerGUI::setupListWidget(SkTDArray<SkString*>* command) {
chudy@google.comc432f002012-07-10 13:19:25 +0000608 fListWidget.clear();
chudy@google.com902ebe52012-06-29 14:21:22 +0000609 int counter = 0;
chudy@google.com97cee972012-08-07 20:41:37 +0000610 for (int i = 0; i < command->count(); i++) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000611 QListWidgetItem *item = new QListWidgetItem();
chudy@google.com97cee972012-08-07 20:41:37 +0000612 item->setData(Qt::DisplayRole, (*command)[i]->c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000613 item->setData(Qt::UserRole + 1, counter++);
chudy@google.comc432f002012-07-10 13:19:25 +0000614 fListWidget.addItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000615 }
616}
617
chudy@google.com97cee972012-08-07 20:41:37 +0000618void SkDebuggerGUI::setupComboBox(SkTDArray<SkString*>* command) {
chudy@google.comc432f002012-07-10 13:19:25 +0000619 fFilter.clear();
620 fFilter.addItem("--Filter By Available Commands--");
chudy@google.com902ebe52012-06-29 14:21:22 +0000621
622 std::map<std::string, int> map;
chudy@google.com97cee972012-08-07 20:41:37 +0000623 for (int i = 0; i < command->count(); i++) {
624 map[(*command)[i]->c_str()]++;
chudy@google.com902ebe52012-06-29 14:21:22 +0000625 }
626
627 QString overview;
chudy@google.com607357f2012-08-07 16:12:23 +0000628 int counter = 0;
chudy@google.com7dcae672012-07-09 20:26:53 +0000629 for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
630 ++it) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000631 overview.append((it->first).c_str());
632 overview.append(": ");
633 overview.append(QString::number(it->second));
634 overview.append("<br/>");
chudy@google.com7dcae672012-07-09 20:26:53 +0000635 counter += it->second;
chudy@google.comc432f002012-07-10 13:19:25 +0000636 fFilter.addItem((it->first).c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000637 }
638 QString total;
639 total.append("Total Draw Commands: ");
640 total.append(QString::number(counter));
641 total.append("<br/>");
642 overview.insert(0, total);
643
644 overview.append("<br/>");
chudy@google.com607357f2012-08-07 16:12:23 +0000645 overview.append("SkPicture Width: ");
chudy@google.com902ebe52012-06-29 14:21:22 +0000646 // NOTE(chudy): This is where we can pull out the SkPictures width.
chudy@google.com607357f2012-08-07 16:12:23 +0000647 overview.append(QString::number(fDebugger.pictureWidth()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000648 overview.append("px<br/>");
chudy@google.com607357f2012-08-07 16:12:23 +0000649 overview.append("SkPicture Height: ");
650 overview.append(QString::number(fDebugger.pictureHeight()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000651 overview.append("px");
chudy@google.comc432f002012-07-10 13:19:25 +0000652 fInspectorWidget.setOverviewText(overview);
chudy@google.com902ebe52012-06-29 14:21:22 +0000653
654 // NOTE(chudy): Makes first item unselectable.
chudy@google.com7dcae672012-07-09 20:26:53 +0000655 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
chudy@google.comc432f002012-07-10 13:19:25 +0000656 fFilter.model());
657 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
658 fFilter.rootModelIndex());
chudy@google.com902ebe52012-06-29 14:21:22 +0000659 QStandardItem* firstItem = model->itemFromIndex(firstIndex);
660 firstItem->setSelectable(false);
661}