blob: 25f2ba9af2158fe80ffddf06bcb2bf46941f7a1c [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
8#include <iostream>
9#include "SkDebuggerGUI.h"
10#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.comc432f002012-07-10 13:19:25 +000041 , fMenuBar(this)
42 , fMenuFile(this)
43 , fMenuNavigate(this)
44 , fMenuView(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000045 , fBreakpointsActivated(false)
46 , fDeletesActivated(false)
47 , fPause(false)
chudy@google.comd3058f52012-07-19 13:41:27 +000048 , fLoading(false)
chudy@google.comc432f002012-07-10 13:19:25 +000049{
chudy@google.com902ebe52012-06-29 14:21:22 +000050 setupUi(this);
chudy@google.comea5488b2012-07-26 19:38:22 +000051 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000052 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
chudy@google.comea5488b2012-07-26 19:38:22 +000053 connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()));
54 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000055 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
chudy@google.comea5488b2012-07-26 19:38:22 +000056 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint()));
chudy@google.comc432f002012-07-10 13:19:25 +000057 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
58 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
59 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
chudy@google.comea5488b2012-07-26 19:38:22 +000060 connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward()));
61 connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints()));
62 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()));
63 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionSettings()));
64 connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString)));
chudy@google.comc432f002012-07-10 13:19:25 +000065 connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000066 connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
67 connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
chudy@google.comc432f002012-07-10 13:19:25 +000068 connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
chudy@google.comea5488b2012-07-26 19:38:22 +000069 connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this, SLOT(actionCommandFilter()));
70 connect(fSettingsWidget.getGLCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionGLWidget(bool)));
71 connect(fSettingsWidget.getRasterCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionRasterWidget(bool)));
72 connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool)));
chudy@google.come504de02012-07-16 18:35:23 +000073 connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000074 connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
chudy@google.comea5488b2012-07-26 19:38:22 +000075 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
76 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int)));
77 connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float)));
78 connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int)));
chudy@google.com0ab03392012-07-28 20:16:11 +000079 connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs()));
80 connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000081
chudy@google.coma1226312012-07-26 20:26:44 +000082 fMapper.setMapping(&fActionZoomIn, 1);
83 fMapper.setMapping(&fActionZoomOut, -1);
84
85 connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map()));
86 connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map()));
87 connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(keyZoom(int)));
88
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000089 fInspectorWidget.setDisabled(true);
chudy@google.comd3058f52012-07-19 13:41:27 +000090 fMenuEdit.setDisabled(true);
91 fMenuNavigate.setDisabled(true);
92 fMenuView.setDisabled(true);
chudy@google.com902ebe52012-06-29 14:21:22 +000093}
94
chudy@google.com2d537a12012-07-31 12:49:52 +000095SkDebuggerGUI::~SkDebuggerGUI() {}
chudy@google.com902ebe52012-06-29 14:21:22 +000096
97void SkDebuggerGUI::actionBreakpoints() {
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000098 fBreakpointsActivated = !fBreakpointsActivated;
chudy@google.comc432f002012-07-10 13:19:25 +000099 for (int row = 0; row < fListWidget.count(); row++) {
100 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000101 item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated);
102 }
103}
chudy@google.com902ebe52012-06-29 14:21:22 +0000104
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000105void SkDebuggerGUI::showDeletes() {
106 fDeletesActivated = !fDeletesActivated;
107 for (int row = 0; row < fListWidget.count(); row++) {
108 QListWidgetItem *item = fListWidget.item(row);
109 bool isVisible = fCanvasWidget.commandIsVisibleAtIndex(row);
110 item->setHidden(isVisible && fDeletesActivated);
chudy@google.com902ebe52012-06-29 14:21:22 +0000111 }
112}
113
114void SkDebuggerGUI::actionCancel() {
chudy@google.comc432f002012-07-10 13:19:25 +0000115 for (int row = 0; row < fListWidget.count(); row++) {
116 fListWidget.item(row)->setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000117 }
118}
119
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000120void SkDebuggerGUI::actionClearBreakpoints() {
121 for (int row = 0; row < fListWidget.count(); row++) {
122 QListWidgetItem* item = fListWidget.item(row);
123 item->setCheckState(Qt::Unchecked);
124 item->setData(Qt::DecorationRole,
125 QPixmap(":/images/Icons/blank.png"));
126 }
127}
128
129void SkDebuggerGUI::actionClearDeletes() {
130 for (int row = 0; row < fListWidget.count(); row++) {
131 QListWidgetItem* item = fListWidget.item(row);
132 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
133 fCanvasWidget.setCommandVisibliltyAtIndex(row, true);
134 }
135 if (fPause) {
136 fCanvasWidget.drawTo(fPausedRow);
137 } else {
138 fCanvasWidget.drawTo(fListWidget.currentRow());
139 }
140}
141
chudy@google.com902ebe52012-06-29 14:21:22 +0000142void SkDebuggerGUI::actionCommandFilter() {
chudy@google.comc432f002012-07-10 13:19:25 +0000143 fCanvasWidget.toggleCurrentCommandFilter(
144 fSettingsWidget.getVisibilityButton()->isChecked());
145 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com902ebe52012-06-29 14:21:22 +0000146}
147
148void SkDebuggerGUI::actionClose() {
149 this->close();
150}
151
152void SkDebuggerGUI::actionDelete() {
chudy@google.comc432f002012-07-10 13:19:25 +0000153 int currentRow = fListWidget.currentRow();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000154 QListWidgetItem* item = fListWidget.currentItem();
155
156 if (fCanvasWidget.commandIsVisibleAtIndex(currentRow)) {
157 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/delete.png"));
158 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, false);
159 } else {
160 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
161 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, true);
162 }
163
chudy@google.come504de02012-07-16 18:35:23 +0000164 if (fPause) {
165 fCanvasWidget.drawTo(fPausedRow);
166 } else {
167 fCanvasWidget.drawTo(currentRow);
168 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000169}
170
chudy@google.comea5488b2012-07-26 19:38:22 +0000171void SkDebuggerGUI::actionGLWidget(bool isToggled) {
172 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled);
173}
174
chudy@google.com902ebe52012-06-29 14:21:22 +0000175void SkDebuggerGUI::actionInspector() {
chudy@google.comc432f002012-07-10 13:19:25 +0000176 if (fInspectorWidget.isHidden()) {
177 fInspectorWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000178 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000179 fInspectorWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000180 }
181}
182
183void SkDebuggerGUI::actionPlay() {
chudy@google.comc432f002012-07-10 13:19:25 +0000184 for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
chudy@google.com7dcae672012-07-09 20:26:53 +0000185 row++) {
chudy@google.comc432f002012-07-10 13:19:25 +0000186 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000187 if (item->checkState() == Qt::Checked) {
chudy@google.comc432f002012-07-10 13:19:25 +0000188 fListWidget.setCurrentItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000189 return;
190 }
191 }
chudy@google.comc432f002012-07-10 13:19:25 +0000192 fListWidget.setCurrentRow(fListWidget.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000193}
194
chudy@google.comea5488b2012-07-26 19:38:22 +0000195void SkDebuggerGUI::actionRasterWidget(bool isToggled) {
196 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, !isToggled);
197}
198
chudy@google.com902ebe52012-06-29 14:21:22 +0000199void SkDebuggerGUI::actionRewind() {
chudy@google.come504de02012-07-16 18:35:23 +0000200 fListWidget.setCurrentRow(0);
chudy@google.com902ebe52012-06-29 14:21:22 +0000201}
202
chudy@google.com0ab03392012-07-28 20:16:11 +0000203void SkDebuggerGUI::actionSave() {
204 QString filename;
205 filename.append(fPath);
206 filename.append("/");
207 filename.append(fDirectoryWidget.currentItem()->text());
208 saveToFile(filename);
209}
210
211void SkDebuggerGUI::actionSaveAs() {
212 QString filename = QFileDialog::getSaveFileName(this, "Save File", "",
213 "Skia Picture (*skp)");
chudy@google.com38b08ce2012-07-28 23:26:10 +0000214 if (!filename.endsWith(".skp", Qt::CaseInsensitive)) {
chudy@google.com0ab03392012-07-28 20:16:11 +0000215 filename.append(".skp");
216 }
217 saveToFile(filename);
218}
219
chudy@google.com7dcae672012-07-09 20:26:53 +0000220void SkDebuggerGUI::actionScale(float scaleFactor) {
chudy@google.comc432f002012-07-10 13:19:25 +0000221 fSettingsWidget.setZoomText(scaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000222}
223
chudy@google.com902ebe52012-06-29 14:21:22 +0000224void SkDebuggerGUI::actionSettings() {
chudy@google.comc432f002012-07-10 13:19:25 +0000225 if (fSettingsWidget.isHidden()) {
226 fSettingsWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000227 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000228 fSettingsWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000229 }
230}
231
232void SkDebuggerGUI::actionStepBack() {
chudy@google.comc432f002012-07-10 13:19:25 +0000233 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000234 if (currentRow != 0) {
chudy@google.comc432f002012-07-10 13:19:25 +0000235 fListWidget.setCurrentRow(currentRow - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000236 }
237}
238
239void SkDebuggerGUI::actionStepForward() {
chudy@google.comc432f002012-07-10 13:19:25 +0000240 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000241 QString curRow = QString::number(currentRow);
chudy@google.comc432f002012-07-10 13:19:25 +0000242 QString curCount = QString::number(fListWidget.count());
243 if (currentRow < fListWidget.count() - 1) {
244 fListWidget.setCurrentRow(currentRow + 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000245 }
246}
247
chudy@google.com0ab03392012-07-28 20:16:11 +0000248void SkDebuggerGUI::saveToFile(QString filename) {
249 SkFILEWStream file(filename.toAscii());
250 SkPicture picture;
251 SkCanvas* canvas = picture.beginRecording(100,100);
252 fCanvasWidget.getCurrentDebugCanvas()->draw(canvas);
253 picture.endRecording();
254 picture.serialize(&file);
255}
256
chudy@google.com902ebe52012-06-29 14:21:22 +0000257void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
258 if (fDirectoryWidgetActive) {
259 QString fileName;
260 fileName.append(fPath);
261 fileName.append("/");
262 fileName.append(item->text());
263 loadPicture(fileName);
264 }
265}
266
267void SkDebuggerGUI::openFile() {
chudy@google.com7dcae672012-07-09 20:26:53 +0000268 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
269 tr("Files (*.*)"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000270 fDirectoryWidgetActive = false;
271 if (!fileName.isNull()) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000272 QFileInfo pathInfo(fileName);
273 fPath = pathInfo.path();
274 loadPicture(fileName);
275 setupDirectoryWidget();
276 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000277 fDirectoryWidgetActive = true;
278}
279
chudy@google.comc432f002012-07-10 13:19:25 +0000280void SkDebuggerGUI::pauseDrawing(bool isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000281 // Qt uses 0 for unchecked, 1 for partially enabled and 2 for checked.
chudy@google.comc432f002012-07-10 13:19:25 +0000282 if (isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000283 fPause = true;
chudy@google.com233e4b82012-07-12 14:38:49 +0000284 fPausedRow = fListWidget.currentRow();
chudy@google.com7dcae672012-07-09 20:26:53 +0000285 } else {
286 fPause = false;
chudy@google.comc432f002012-07-10 13:19:25 +0000287 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com7dcae672012-07-09 20:26:53 +0000288 }
289}
290
chudy@google.com902ebe52012-06-29 14:21:22 +0000291void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000292 if(!fLoading) {
293 int currentRow = fListWidget.currentRow();
chudy@google.comd3058f52012-07-19 13:41:27 +0000294
chudy@google.comea5488b2012-07-26 19:38:22 +0000295 if (currentRow != -1) {
296 if (!fPause) {
297 fCanvasWidget.drawTo(currentRow);
chudy@google.comd3058f52012-07-19 13:41:27 +0000298 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000299 std::vector<std::string> *cuffInfo = fCanvasWidget.getCurrentCommandInfo(
300 currentRow);
301
302 /* TODO(chudy): Add command type before parameters. Rename v
303 * to something more informative. */
304 if (cuffInfo) {
305 std::vector<std::string>::iterator it;
306
307 QString info;
308 info.append("<b>Parameters: </b><br/>");
309 for (it = cuffInfo->begin(); it != cuffInfo->end(); ++it) {
310 info.append(QString((*it).c_str()));
311 info.append("<br/>");
312 }
313 fInspectorWidget.setDetailText(info);
314 fInspectorWidget.setDisabled(false);
315 fInspectorWidget.setMatrix(fCanvasWidget.getCurrentMatrix());
316 fInspectorWidget.setClip(fCanvasWidget.getCurrentClip());
317 }
chudy@google.comd3058f52012-07-19 13:41:27 +0000318 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000319
chudy@google.com902ebe52012-06-29 14:21:22 +0000320 }
321}
322
chudy@google.com9ca9bfe2012-07-12 21:58:14 +0000323void SkDebuggerGUI::selectCommand(int command) {
324 if (fPause) {
325 fListWidget.setCurrentRow(command);
326 }
327}
328
chudy@google.com902ebe52012-06-29 14:21:22 +0000329void SkDebuggerGUI::toggleBreakpoint() {
chudy@google.comc432f002012-07-10 13:19:25 +0000330 QListWidgetItem* item = fListWidget.currentItem();
chudy@google.com902ebe52012-06-29 14:21:22 +0000331 if (item->checkState() == Qt::Unchecked) {
332 item->setCheckState(Qt::Checked);
chudy@google.come565de42012-07-12 14:15:54 +0000333 item->setData(Qt::DecorationRole,
334 QPixmap(":/images/Icons/breakpoint_16x16.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000335 } else {
chudy@google.com902ebe52012-06-29 14:21:22 +0000336 item->setCheckState(Qt::Unchecked);
chudy@google.come565de42012-07-12 14:15:54 +0000337 item->setData(Qt::DecorationRole,
338 QPixmap(":/images/Icons/blank.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000339 }
340}
341
342void SkDebuggerGUI::toggleDirectory() {
chudy@google.comc432f002012-07-10 13:19:25 +0000343 if (fDirectoryWidget.isHidden()) {
344 fDirectoryWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000345 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000346 fDirectoryWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000347 }
348}
349
350void SkDebuggerGUI::toggleFilter(QString string) {
chudy@google.comc432f002012-07-10 13:19:25 +0000351 for (int row = 0; row < fListWidget.count(); row++) {
352 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000353 if (item->text() == string) {
354 item->setHidden(false);
355 } else {
356 item->setHidden(true);
357 }
358 }
359}
360
361void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
362 QIcon windowIcon;
chudy@google.com7dcae672012-07-09 20:26:53 +0000363 windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(),
364 QIcon::Normal, QIcon::Off);
chudy@google.com902ebe52012-06-29 14:21:22 +0000365 SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
366 SkDebuggerGUI->resize(1200, 1000);
367 SkDebuggerGUI->setWindowIcon(windowIcon);
chudy@google.comc432f002012-07-10 13:19:25 +0000368 SkDebuggerGUI->setWindowTitle("Skia Debugger");
chudy@google.com902ebe52012-06-29 14:21:22 +0000369
chudy@google.come504de02012-07-16 18:35:23 +0000370 fActionOpen.setShortcuts(QKeySequence::Open);
chudy@google.comc432f002012-07-10 13:19:25 +0000371 fActionOpen.setText("Open");
chudy@google.com902ebe52012-06-29 14:21:22 +0000372
373 QIcon breakpoint;
chudy@google.com7dcae672012-07-09 20:26:53 +0000374 breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"),
375 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000376 fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
chudy@google.comc432f002012-07-10 13:19:25 +0000377 fActionBreakpoint.setIcon(breakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000378 fActionBreakpoint.setText("Breakpoints");
chudy@google.com902ebe52012-06-29 14:21:22 +0000379
380 QIcon cancel;
chudy@google.come504de02012-07-16 18:35:23 +0000381 cancel.addFile(QString::fromUtf8(":/images/Ico/reload.png"), QSize(),
chudy@google.com7dcae672012-07-09 20:26:53 +0000382 QIcon::Normal, QIcon::Off);
chudy@google.comc432f002012-07-10 13:19:25 +0000383 fActionCancel.setIcon(cancel);
384 fActionCancel.setText("Clear Filter");
chudy@google.com902ebe52012-06-29 14:21:22 +0000385
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000386 fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
387 fActionClearBreakpoints.setText("Clear Breakpoints");
388
389 fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
390 fActionClearDeletes.setText("Clear Deletes");
391
chudy@google.come504de02012-07-16 18:35:23 +0000392 fActionClose.setShortcuts(QKeySequence::Quit);
chudy@google.comc432f002012-07-10 13:19:25 +0000393 fActionClose.setText("Exit");
chudy@google.com902ebe52012-06-29 14:21:22 +0000394
chudy@google.come504de02012-07-16 18:35:23 +0000395 fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
396 fActionCreateBreakpoint.setText("Set Breakpoint");
397
398 fActionDelete.setShortcut(QKeySequence(tr("X")));
chudy@google.comc432f002012-07-10 13:19:25 +0000399 fActionDelete.setText("Delete Command");
chudy@google.com902ebe52012-06-29 14:21:22 +0000400
chudy@google.come504de02012-07-16 18:35:23 +0000401 fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
402 fActionDirectory.setText("Directory");
chudy@google.com902ebe52012-06-29 14:21:22 +0000403
chudy@google.comc432f002012-07-10 13:19:25 +0000404 QIcon inspector;
chudy@google.come504de02012-07-16 18:35:23 +0000405 inspector.addFile(QString::fromUtf8(":/images/Ico/inspector.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000406 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000407 fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
chudy@google.comc432f002012-07-10 13:19:25 +0000408 fActionInspector.setIcon(inspector);
chudy@google.come504de02012-07-16 18:35:23 +0000409 fActionInspector.setText("Inspector");
chudy@google.com902ebe52012-06-29 14:21:22 +0000410
chudy@google.comc432f002012-07-10 13:19:25 +0000411 QIcon play;
chudy@google.come504de02012-07-16 18:35:23 +0000412 play.addFile(QString::fromUtf8(":/images/Ico/play.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000413 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000414 fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
chudy@google.comc432f002012-07-10 13:19:25 +0000415 fActionPlay.setIcon(play);
416 fActionPlay.setText("Play");
chudy@google.com902ebe52012-06-29 14:21:22 +0000417
chudy@google.come504de02012-07-16 18:35:23 +0000418 QIcon pause;
419 pause.addFile(QString::fromUtf8(":/images/Ico/pause.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000420 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000421 fActionPause.setShortcut(QKeySequence(tr("Space")));
422 fActionPause.setCheckable(true);
423 fActionPause.setIcon(pause);
424 fActionPause.setText("Pause");
425
chudy@google.comc432f002012-07-10 13:19:25 +0000426 QIcon rewind;
chudy@google.come504de02012-07-16 18:35:23 +0000427 rewind.addFile(QString::fromUtf8(":/images/Ico/rewind.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000428 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000429 fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
chudy@google.comc432f002012-07-10 13:19:25 +0000430 fActionRewind.setIcon(rewind);
431 fActionRewind.setText("Rewind");
chudy@google.com902ebe52012-06-29 14:21:22 +0000432
chudy@google.com0ab03392012-07-28 20:16:11 +0000433 fActionSave.setShortcut(QKeySequence::Save);
434 fActionSave.setText("Save");
435 fActionSave.setDisabled(true);
436 fActionSaveAs.setShortcut(QKeySequence::SaveAs);
437 fActionSaveAs.setText("Save As");
438 fActionSaveAs.setDisabled(true);
439
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000440 fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
441 fActionShowDeletes.setText("Deleted Commands");
442
chudy@google.comc432f002012-07-10 13:19:25 +0000443 QIcon stepBack;
chudy@google.come504de02012-07-16 18:35:23 +0000444 stepBack.addFile(QString::fromUtf8(":/images/Ico/previous.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000445 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000446 fActionStepBack.setShortcut(QKeySequence(tr("[")));
chudy@google.comc432f002012-07-10 13:19:25 +0000447 fActionStepBack.setIcon(stepBack);
448 fActionStepBack.setText("Step Back");
chudy@google.com902ebe52012-06-29 14:21:22 +0000449
chudy@google.comc432f002012-07-10 13:19:25 +0000450 QIcon stepForward;
chudy@google.come504de02012-07-16 18:35:23 +0000451 stepForward.addFile(QString::fromUtf8(":/images/Ico/next.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000452 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000453 fActionStepForward.setShortcut(QKeySequence(tr("]")));
chudy@google.comc432f002012-07-10 13:19:25 +0000454 fActionStepForward.setIcon(stepForward);
455 fActionStepForward.setText("Step Forward");
456
chudy@google.coma1226312012-07-26 20:26:44 +0000457 fActionZoomIn.setShortcut(QKeySequence(tr("Ctrl+=")));
458 fActionZoomIn.setText("Zoom In");
459 fActionZoomOut.setShortcut(QKeySequence(tr("Ctrl+-")));
460 fActionZoomOut.setText("Zoom Out");
461
chudy@google.comc432f002012-07-10 13:19:25 +0000462 fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
463 fListWidget.setObjectName(QString::fromUtf8("listWidget"));
464 fListWidget.setMaximumWidth(250);
465
466 fFilter.addItem("--Filter By Available Commands--");
467
468 fDirectoryWidget.setMaximumWidth(250);
469 fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
470
471 fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000472 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000473
chudy@google.comc432f002012-07-10 13:19:25 +0000474 fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000475 QSizePolicy::Expanding);
chudy@google.comc432f002012-07-10 13:19:25 +0000476 fInspectorWidget.setMaximumHeight(300);
chudy@google.com902ebe52012-06-29 14:21:22 +0000477
chudy@google.comc432f002012-07-10 13:19:25 +0000478 fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
479 QSizePolicy::Expanding);
480 fSettingsWidget.setMaximumWidth(250);
chudy@google.com902ebe52012-06-29 14:21:22 +0000481
chudy@google.comc432f002012-07-10 13:19:25 +0000482 fLeftColumnLayout.setSpacing(6);
483 fLeftColumnLayout.addWidget(&fListWidget);
484 fLeftColumnLayout.addWidget(&fDirectoryWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000485
chudy@google.comc432f002012-07-10 13:19:25 +0000486 fCanvasAndSettingsLayout.setSpacing(6);
487 fCanvasAndSettingsLayout.addWidget(&fCanvasWidget);
488 fCanvasAndSettingsLayout.addWidget(&fSettingsWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000489
chudy@google.comc432f002012-07-10 13:19:25 +0000490 fMainAndRightColumnLayout.setSpacing(6);
491 fMainAndRightColumnLayout.addLayout(&fCanvasAndSettingsLayout);
492 fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000493
chudy@google.com2d537a12012-07-31 12:49:52 +0000494 fCentralWidget.setLayout(&fContainerLayout);
chudy@google.comc432f002012-07-10 13:19:25 +0000495 fContainerLayout.setSpacing(6);
496 fContainerLayout.setContentsMargins(11, 11, 11, 11);
497 fContainerLayout.addLayout(&fLeftColumnLayout);
498 fContainerLayout.addLayout(&fMainAndRightColumnLayout);
499
500 SkDebuggerGUI->setCentralWidget(&fCentralWidget);
501 SkDebuggerGUI->setStatusBar(&fStatusBar);
502
chudy@google.come504de02012-07-16 18:35:23 +0000503 fToolBar.setIconSize(QSize(32, 32));
chudy@google.comc432f002012-07-10 13:19:25 +0000504 fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
505 SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000506
chudy@google.com0ab03392012-07-28 20:16:11 +0000507 fSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000508
chudy@google.comc432f002012-07-10 13:19:25 +0000509 fToolBar.addAction(&fActionRewind);
510 fToolBar.addAction(&fActionStepBack);
chudy@google.come504de02012-07-16 18:35:23 +0000511 fToolBar.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000512 fToolBar.addAction(&fActionStepForward);
513 fToolBar.addAction(&fActionPlay);
514 fToolBar.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000515 fToolBar.addAction(&fActionInspector);
chudy@google.comc432f002012-07-10 13:19:25 +0000516 fToolBar.addSeparator();
chudy@google.com0ab03392012-07-28 20:16:11 +0000517 fToolBar.addWidget(&fSpacer);
chudy@google.comc432f002012-07-10 13:19:25 +0000518 fToolBar.addWidget(&fFilter);
519 fToolBar.addAction(&fActionCancel);
chudy@google.com902ebe52012-06-29 14:21:22 +0000520
521 // TODO(chudy): Remove static call.
522 fDirectoryWidgetActive = false;
chudy@google.comea5488b2012-07-26 19:38:22 +0000523 fPath = "/usr/local/google/home/chudy/trunk-git/trunk/skp";
chudy@google.com902ebe52012-06-29 14:21:22 +0000524 setupDirectoryWidget();
525 fDirectoryWidgetActive = true;
526
chudy@google.com902ebe52012-06-29 14:21:22 +0000527 // Menu Bar
chudy@google.comc432f002012-07-10 13:19:25 +0000528 fMenuFile.setTitle("File");
529 fMenuFile.addAction(&fActionOpen);
chudy@google.com0ab03392012-07-28 20:16:11 +0000530 fMenuFile.addAction(&fActionSave);
531 fMenuFile.addAction(&fActionSaveAs);
chudy@google.comc432f002012-07-10 13:19:25 +0000532 fMenuFile.addAction(&fActionClose);
chudy@google.come504de02012-07-16 18:35:23 +0000533
534 fMenuEdit.setTitle("Edit");
535 fMenuEdit.addAction(&fActionDelete);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000536 fMenuEdit.addAction(&fActionClearDeletes);
537 fMenuEdit.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000538 fMenuEdit.addAction(&fActionCreateBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000539 fMenuEdit.addAction(&fActionClearBreakpoints);
chudy@google.come504de02012-07-16 18:35:23 +0000540
chudy@google.comc432f002012-07-10 13:19:25 +0000541 fMenuNavigate.setTitle("Navigate");
chudy@google.come504de02012-07-16 18:35:23 +0000542 fMenuNavigate.addAction(&fActionRewind);
543 fMenuNavigate.addAction(&fActionStepBack);
544 fMenuNavigate.addAction(&fActionStepForward);
545 fMenuNavigate.addAction(&fActionPlay);
546 fMenuNavigate.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000547 fMenuNavigate.addAction(&fActionGoToLine);
chudy@google.come504de02012-07-16 18:35:23 +0000548
chudy@google.comc432f002012-07-10 13:19:25 +0000549 fMenuView.setTitle("View");
chudy@google.come504de02012-07-16 18:35:23 +0000550 fMenuView.addAction(&fActionBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000551 fMenuView.addAction(&fActionShowDeletes);
chudy@google.coma1226312012-07-26 20:26:44 +0000552 fMenuView.addAction(&fActionZoomIn);
553 fMenuView.addAction(&fActionZoomOut);
chudy@google.come504de02012-07-16 18:35:23 +0000554
555 fMenuWindows.setTitle("Window");
556 fMenuWindows.addAction(&fActionInspector);
557 fMenuWindows.addAction(&fActionDirectory);
chudy@google.comc432f002012-07-10 13:19:25 +0000558
559 fActionGoToLine.setText("Go to Line...");
560 fActionGoToLine.setDisabled(true);
561 fMenuBar.addAction(fMenuFile.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000562 fMenuBar.addAction(fMenuEdit.menuAction());
chudy@google.comc432f002012-07-10 13:19:25 +0000563 fMenuBar.addAction(fMenuView.menuAction());
564 fMenuBar.addAction(fMenuNavigate.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000565 fMenuBar.addAction(fMenuWindows.menuAction());
chudy@google.com902ebe52012-06-29 14:21:22 +0000566
chudy@google.com7dcae672012-07-09 20:26:53 +0000567 fPause = false;
568
chudy@google.comc432f002012-07-10 13:19:25 +0000569 SkDebuggerGUI->setMenuBar(&fMenuBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000570 QMetaObject::connectSlotsByName(SkDebuggerGUI);
571}
572
573void SkDebuggerGUI::setupDirectoryWidget() {
chudy@google.comc432f002012-07-10 13:19:25 +0000574 QDir dir(fPath);
chudy@google.com902ebe52012-06-29 14:21:22 +0000575 QRegExp r(".skp");
chudy@google.comc432f002012-07-10 13:19:25 +0000576 fDirectoryWidget.clear();
577 const QStringList files = dir.entryList();
chudy@google.com902ebe52012-06-29 14:21:22 +0000578 foreach (QString f, files) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000579 if (f.contains(r))
chudy@google.comc432f002012-07-10 13:19:25 +0000580 fDirectoryWidget.addItem(f);
chudy@google.com902ebe52012-06-29 14:21:22 +0000581 }
582}
583
chudy@google.com902ebe52012-06-29 14:21:22 +0000584void SkDebuggerGUI::loadPicture(QString fileName) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000585 fLoading = true;
chudy@google.comc432f002012-07-10 13:19:25 +0000586 fCanvasWidget.loadPicture(fileName);
587 std::vector<std::string> *cv = fCanvasWidget.getDrawCommands();
chudy@google.com7dcae672012-07-09 20:26:53 +0000588 /* fDebugCanvas is reinitialized every load picture. Need it to retain value
589 * of the visibility filter. */
chudy@google.comc432f002012-07-10 13:19:25 +0000590 fCanvasWidget.toggleCurrentCommandFilter(
591 fSettingsWidget.getVisibilityButton()->isChecked());
chudy@google.com902ebe52012-06-29 14:21:22 +0000592 setupListWidget(cv);
593 setupComboBox(cv);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000594 fInspectorWidget.setDisabled(false);
chudy@google.come606d6e2012-07-12 14:31:25 +0000595 fSettingsWidget.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000596 fMenuEdit.setDisabled(false);
597 fMenuNavigate.setDisabled(false);
598 fMenuView.setDisabled(false);
chudy@google.com0ab03392012-07-28 20:16:11 +0000599 fActionSave.setDisabled(false);
600 fActionSaveAs.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000601 fLoading = false;
602 actionPlay();
chudy@google.com902ebe52012-06-29 14:21:22 +0000603}
604
605void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000606 fListWidget.clear();
chudy@google.com902ebe52012-06-29 14:21:22 +0000607 int counter = 0;
608 for (unsigned int i = 0; i < cv->size(); i++) {
609 QListWidgetItem *item = new QListWidgetItem();
610 item->setData(Qt::DisplayRole, (*cv)[i].c_str());
611 item->setData(Qt::UserRole + 1, counter++);
chudy@google.comc432f002012-07-10 13:19:25 +0000612 fListWidget.addItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000613 }
614}
615
616void SkDebuggerGUI::setupComboBox(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000617 fFilter.clear();
618 fFilter.addItem("--Filter By Available Commands--");
chudy@google.com902ebe52012-06-29 14:21:22 +0000619
620 std::map<std::string, int> map;
621 for (unsigned int i = 0; i < cv->size(); i++) {
622 map[(*cv)[i]]++;
623 }
624
625 QString overview;
626 int counter;
chudy@google.com7dcae672012-07-09 20:26:53 +0000627 for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
628 ++it) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000629 overview.append((it->first).c_str());
630 overview.append(": ");
631 overview.append(QString::number(it->second));
632 overview.append("<br/>");
chudy@google.com7dcae672012-07-09 20:26:53 +0000633 counter += it->second;
chudy@google.comc432f002012-07-10 13:19:25 +0000634 fFilter.addItem((it->first).c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000635 }
636 QString total;
637 total.append("Total Draw Commands: ");
638 total.append(QString::number(counter));
639 total.append("<br/>");
640 overview.insert(0, total);
641
642 overview.append("<br/>");
643 overview.append("SkBitmap Width: ");
644 // NOTE(chudy): This is where we can pull out the SkPictures width.
chudy@google.comc432f002012-07-10 13:19:25 +0000645 overview.append(QString::number(fCanvasWidget.getBitmapWidth()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000646 overview.append("px<br/>");
647 overview.append("SkBitmap Height: ");
chudy@google.comc432f002012-07-10 13:19:25 +0000648 overview.append(QString::number(fCanvasWidget.getBitmapHeight()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000649 overview.append("px");
chudy@google.comc432f002012-07-10 13:19:25 +0000650 fInspectorWidget.setOverviewText(overview);
chudy@google.com902ebe52012-06-29 14:21:22 +0000651
652 // NOTE(chudy): Makes first item unselectable.
chudy@google.com7dcae672012-07-09 20:26:53 +0000653 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
chudy@google.comc432f002012-07-10 13:19:25 +0000654 fFilter.model());
655 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
656 fFilter.rootModelIndex());
chudy@google.com902ebe52012-06-29 14:21:22 +0000657 QStandardItem* firstItem = model->itemFromIndex(firstIndex);
658 firstItem->setSelectable(false);
659}