blob: 131386c12058d2411ee29fd5c775c5e95f3cac65 [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)
14 , fActionOpen(this)
15 , fActionBreakpoint(this)
16 , fActionCancel(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000017 , fActionClearBreakpoints(this)
chudy@google.come504de02012-07-16 18:35:23 +000018 , fActionClearDeletes(this)
chudy@google.comc432f002012-07-10 13:19:25 +000019 , fActionClose(this)
chudy@google.come504de02012-07-16 18:35:23 +000020 , fActionCreateBreakpoint(this)
chudy@google.comc432f002012-07-10 13:19:25 +000021 , fActionDelete(this)
22 , fActionDirectory(this)
23 , fActionGoToLine(this)
24 , fActionInspector(this)
25 , fActionPlay(this)
chudy@google.come504de02012-07-16 18:35:23 +000026 , fActionPause(this)
chudy@google.comc432f002012-07-10 13:19:25 +000027 , fActionRewind(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000028 , fActionShowDeletes(this)
chudy@google.comc432f002012-07-10 13:19:25 +000029 , fActionStepBack(this)
30 , fActionStepForward(this)
31 , fCentralWidget(this)
32 , fFilter(&fCentralWidget)
33 , fContainerLayout(&fCentralWidget)
34 , fListWidget(&fCentralWidget)
35 , fDirectoryWidget(&fCentralWidget)
36 , fCanvasWidget(&fCentralWidget)
37 , fSettingsWidget(&fCentralWidget)
38 , fStatusBar(this)
39 , fMenuBar(this)
40 , fMenuFile(this)
41 , fMenuNavigate(this)
42 , fMenuView(this)
43 , fToolBar(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000044 , fBreakpointsActivated(false)
45 , fDeletesActivated(false)
46 , fPause(false)
chudy@google.comd3058f52012-07-19 13:41:27 +000047 , fLoading(false)
chudy@google.comc432f002012-07-10 13:19:25 +000048{
chudy@google.com902ebe52012-06-29 14:21:22 +000049 setupUi(this);
chudy@google.comea5488b2012-07-26 19:38:22 +000050 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000051 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
chudy@google.comea5488b2012-07-26 19:38:22 +000052 connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()));
53 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000054 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
chudy@google.comea5488b2012-07-26 19:38:22 +000055 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint()));
chudy@google.comc432f002012-07-10 13:19:25 +000056 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
57 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
58 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
chudy@google.comea5488b2012-07-26 19:38:22 +000059 connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward()));
60 connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints()));
61 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()));
62 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionSettings()));
63 connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString)));
chudy@google.comc432f002012-07-10 13:19:25 +000064 connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000065 connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
66 connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
chudy@google.comc432f002012-07-10 13:19:25 +000067 connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
chudy@google.comea5488b2012-07-26 19:38:22 +000068 connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this, SLOT(actionCommandFilter()));
69 connect(fSettingsWidget.getGLCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionGLWidget(bool)));
70 connect(fSettingsWidget.getRasterCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionRasterWidget(bool)));
71 connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool)));
chudy@google.come504de02012-07-16 18:35:23 +000072 connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000073 connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
chudy@google.comea5488b2012-07-26 19:38:22 +000074 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
75 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int)));
76 connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float)));
77 connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int)));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000078
79 fInspectorWidget.setDisabled(true);
chudy@google.comd3058f52012-07-19 13:41:27 +000080 fMenuEdit.setDisabled(true);
81 fMenuNavigate.setDisabled(true);
82 fMenuView.setDisabled(true);
83
chudy@google.com902ebe52012-06-29 14:21:22 +000084}
85
86SkDebuggerGUI::~SkDebuggerGUI() {
87}
88
89void SkDebuggerGUI::actionBreakpoints() {
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000090 fBreakpointsActivated = !fBreakpointsActivated;
chudy@google.comc432f002012-07-10 13:19:25 +000091 for (int row = 0; row < fListWidget.count(); row++) {
92 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000093 item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated);
94 }
95}
chudy@google.com902ebe52012-06-29 14:21:22 +000096
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000097void SkDebuggerGUI::showDeletes() {
98 fDeletesActivated = !fDeletesActivated;
99 for (int row = 0; row < fListWidget.count(); row++) {
100 QListWidgetItem *item = fListWidget.item(row);
101 bool isVisible = fCanvasWidget.commandIsVisibleAtIndex(row);
102 item->setHidden(isVisible && fDeletesActivated);
chudy@google.com902ebe52012-06-29 14:21:22 +0000103 }
104}
105
106void SkDebuggerGUI::actionCancel() {
chudy@google.comc432f002012-07-10 13:19:25 +0000107 for (int row = 0; row < fListWidget.count(); row++) {
108 fListWidget.item(row)->setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000109 }
110}
111
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000112void SkDebuggerGUI::actionClearBreakpoints() {
113 for (int row = 0; row < fListWidget.count(); row++) {
114 QListWidgetItem* item = fListWidget.item(row);
115 item->setCheckState(Qt::Unchecked);
116 item->setData(Qt::DecorationRole,
117 QPixmap(":/images/Icons/blank.png"));
118 }
119}
120
121void SkDebuggerGUI::actionClearDeletes() {
122 for (int row = 0; row < fListWidget.count(); row++) {
123 QListWidgetItem* item = fListWidget.item(row);
124 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
125 fCanvasWidget.setCommandVisibliltyAtIndex(row, true);
126 }
127 if (fPause) {
128 fCanvasWidget.drawTo(fPausedRow);
129 } else {
130 fCanvasWidget.drawTo(fListWidget.currentRow());
131 }
132}
133
chudy@google.com902ebe52012-06-29 14:21:22 +0000134void SkDebuggerGUI::actionCommandFilter() {
chudy@google.comc432f002012-07-10 13:19:25 +0000135 fCanvasWidget.toggleCurrentCommandFilter(
136 fSettingsWidget.getVisibilityButton()->isChecked());
137 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com902ebe52012-06-29 14:21:22 +0000138}
139
140void SkDebuggerGUI::actionClose() {
141 this->close();
142}
143
144void SkDebuggerGUI::actionDelete() {
chudy@google.comc432f002012-07-10 13:19:25 +0000145 int currentRow = fListWidget.currentRow();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000146 QListWidgetItem* item = fListWidget.currentItem();
147
148 if (fCanvasWidget.commandIsVisibleAtIndex(currentRow)) {
149 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/delete.png"));
150 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, false);
151 } else {
152 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
153 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, true);
154 }
155
chudy@google.come504de02012-07-16 18:35:23 +0000156 if (fPause) {
157 fCanvasWidget.drawTo(fPausedRow);
158 } else {
159 fCanvasWidget.drawTo(currentRow);
160 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000161}
162
chudy@google.comea5488b2012-07-26 19:38:22 +0000163void SkDebuggerGUI::actionGLWidget(bool isToggled) {
164 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled);
165}
166
chudy@google.com902ebe52012-06-29 14:21:22 +0000167void SkDebuggerGUI::actionInspector() {
chudy@google.comc432f002012-07-10 13:19:25 +0000168 if (fInspectorWidget.isHidden()) {
169 fInspectorWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000170 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000171 fInspectorWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000172 }
173}
174
175void SkDebuggerGUI::actionPlay() {
chudy@google.comc432f002012-07-10 13:19:25 +0000176 for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
chudy@google.com7dcae672012-07-09 20:26:53 +0000177 row++) {
chudy@google.comc432f002012-07-10 13:19:25 +0000178 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000179 if (item->checkState() == Qt::Checked) {
chudy@google.comc432f002012-07-10 13:19:25 +0000180 fListWidget.setCurrentItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000181 return;
182 }
183 }
chudy@google.comc432f002012-07-10 13:19:25 +0000184 fListWidget.setCurrentRow(fListWidget.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000185}
186
chudy@google.comea5488b2012-07-26 19:38:22 +0000187void SkDebuggerGUI::actionRasterWidget(bool isToggled) {
188 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, !isToggled);
189}
190
chudy@google.com902ebe52012-06-29 14:21:22 +0000191void SkDebuggerGUI::actionRewind() {
chudy@google.come504de02012-07-16 18:35:23 +0000192 fListWidget.setCurrentRow(0);
chudy@google.com902ebe52012-06-29 14:21:22 +0000193}
194
chudy@google.com7dcae672012-07-09 20:26:53 +0000195void SkDebuggerGUI::actionScale(float scaleFactor) {
chudy@google.comc432f002012-07-10 13:19:25 +0000196 fSettingsWidget.setZoomText(scaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000197}
198
chudy@google.com902ebe52012-06-29 14:21:22 +0000199void SkDebuggerGUI::actionSettings() {
chudy@google.comc432f002012-07-10 13:19:25 +0000200 if (fSettingsWidget.isHidden()) {
201 fSettingsWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000202 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000203 fSettingsWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000204 }
205}
206
207void SkDebuggerGUI::actionStepBack() {
chudy@google.comc432f002012-07-10 13:19:25 +0000208 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000209 if (currentRow != 0) {
chudy@google.comc432f002012-07-10 13:19:25 +0000210 fListWidget.setCurrentRow(currentRow - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000211 }
212}
213
214void SkDebuggerGUI::actionStepForward() {
chudy@google.comc432f002012-07-10 13:19:25 +0000215 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000216 QString curRow = QString::number(currentRow);
chudy@google.comc432f002012-07-10 13:19:25 +0000217 QString curCount = QString::number(fListWidget.count());
218 if (currentRow < fListWidget.count() - 1) {
219 fListWidget.setCurrentRow(currentRow + 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000220 }
221}
222
223void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
224 if (fDirectoryWidgetActive) {
225 QString fileName;
226 fileName.append(fPath);
227 fileName.append("/");
228 fileName.append(item->text());
229 loadPicture(fileName);
230 }
231}
232
233void SkDebuggerGUI::openFile() {
chudy@google.com7dcae672012-07-09 20:26:53 +0000234 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
235 tr("Files (*.*)"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000236 fDirectoryWidgetActive = false;
237 if (!fileName.isNull()) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000238 QFileInfo pathInfo(fileName);
239 fPath = pathInfo.path();
240 loadPicture(fileName);
241 setupDirectoryWidget();
242 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000243 fDirectoryWidgetActive = true;
244}
245
chudy@google.comc432f002012-07-10 13:19:25 +0000246void SkDebuggerGUI::pauseDrawing(bool isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000247 // Qt uses 0 for unchecked, 1 for partially enabled and 2 for checked.
chudy@google.comc432f002012-07-10 13:19:25 +0000248 if (isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000249 fPause = true;
chudy@google.com233e4b82012-07-12 14:38:49 +0000250 fPausedRow = fListWidget.currentRow();
chudy@google.com7dcae672012-07-09 20:26:53 +0000251 } else {
252 fPause = false;
chudy@google.comc432f002012-07-10 13:19:25 +0000253 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com7dcae672012-07-09 20:26:53 +0000254 }
255}
256
chudy@google.com902ebe52012-06-29 14:21:22 +0000257void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000258 if(!fLoading) {
259 int currentRow = fListWidget.currentRow();
chudy@google.comd3058f52012-07-19 13:41:27 +0000260
chudy@google.comea5488b2012-07-26 19:38:22 +0000261 if (currentRow != -1) {
262 if (!fPause) {
263 fCanvasWidget.drawTo(currentRow);
chudy@google.comd3058f52012-07-19 13:41:27 +0000264 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000265 std::vector<std::string> *cuffInfo = fCanvasWidget.getCurrentCommandInfo(
266 currentRow);
267
268 /* TODO(chudy): Add command type before parameters. Rename v
269 * to something more informative. */
270 if (cuffInfo) {
271 std::vector<std::string>::iterator it;
272
273 QString info;
274 info.append("<b>Parameters: </b><br/>");
275 for (it = cuffInfo->begin(); it != cuffInfo->end(); ++it) {
276 info.append(QString((*it).c_str()));
277 info.append("<br/>");
278 }
279 fInspectorWidget.setDetailText(info);
280 fInspectorWidget.setDisabled(false);
281 fInspectorWidget.setMatrix(fCanvasWidget.getCurrentMatrix());
282 fInspectorWidget.setClip(fCanvasWidget.getCurrentClip());
283 }
chudy@google.comd3058f52012-07-19 13:41:27 +0000284 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000285
chudy@google.com902ebe52012-06-29 14:21:22 +0000286 }
287}
288
chudy@google.com9ca9bfe2012-07-12 21:58:14 +0000289void SkDebuggerGUI::selectCommand(int command) {
290 if (fPause) {
291 fListWidget.setCurrentRow(command);
292 }
293}
294
chudy@google.com902ebe52012-06-29 14:21:22 +0000295void SkDebuggerGUI::toggleBreakpoint() {
chudy@google.comc432f002012-07-10 13:19:25 +0000296 QListWidgetItem* item = fListWidget.currentItem();
chudy@google.com902ebe52012-06-29 14:21:22 +0000297 if (item->checkState() == Qt::Unchecked) {
298 item->setCheckState(Qt::Checked);
chudy@google.come565de42012-07-12 14:15:54 +0000299 item->setData(Qt::DecorationRole,
300 QPixmap(":/images/Icons/breakpoint_16x16.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000301 } else {
chudy@google.com902ebe52012-06-29 14:21:22 +0000302 item->setCheckState(Qt::Unchecked);
chudy@google.come565de42012-07-12 14:15:54 +0000303 item->setData(Qt::DecorationRole,
304 QPixmap(":/images/Icons/blank.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000305 }
306}
307
308void SkDebuggerGUI::toggleDirectory() {
chudy@google.comc432f002012-07-10 13:19:25 +0000309 if (fDirectoryWidget.isHidden()) {
310 fDirectoryWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000311 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000312 fDirectoryWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000313 }
314}
315
316void SkDebuggerGUI::toggleFilter(QString string) {
chudy@google.comc432f002012-07-10 13:19:25 +0000317 for (int row = 0; row < fListWidget.count(); row++) {
318 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000319 if (item->text() == string) {
320 item->setHidden(false);
321 } else {
322 item->setHidden(true);
323 }
324 }
325}
326
327void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
328 QIcon windowIcon;
chudy@google.com7dcae672012-07-09 20:26:53 +0000329 windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(),
330 QIcon::Normal, QIcon::Off);
chudy@google.com902ebe52012-06-29 14:21:22 +0000331 SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
332 SkDebuggerGUI->resize(1200, 1000);
333 SkDebuggerGUI->setWindowIcon(windowIcon);
chudy@google.comc432f002012-07-10 13:19:25 +0000334 SkDebuggerGUI->setWindowTitle("Skia Debugger");
chudy@google.com902ebe52012-06-29 14:21:22 +0000335
chudy@google.come504de02012-07-16 18:35:23 +0000336 fActionOpen.setShortcuts(QKeySequence::Open);
chudy@google.comc432f002012-07-10 13:19:25 +0000337 fActionOpen.setText("Open");
chudy@google.com902ebe52012-06-29 14:21:22 +0000338
339 QIcon breakpoint;
chudy@google.com7dcae672012-07-09 20:26:53 +0000340 breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"),
341 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000342 fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
chudy@google.comc432f002012-07-10 13:19:25 +0000343 fActionBreakpoint.setIcon(breakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000344 fActionBreakpoint.setText("Breakpoints");
chudy@google.com902ebe52012-06-29 14:21:22 +0000345
346 QIcon cancel;
chudy@google.come504de02012-07-16 18:35:23 +0000347 cancel.addFile(QString::fromUtf8(":/images/Ico/reload.png"), QSize(),
chudy@google.com7dcae672012-07-09 20:26:53 +0000348 QIcon::Normal, QIcon::Off);
chudy@google.comc432f002012-07-10 13:19:25 +0000349 fActionCancel.setIcon(cancel);
350 fActionCancel.setText("Clear Filter");
chudy@google.com902ebe52012-06-29 14:21:22 +0000351
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000352 fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
353 fActionClearBreakpoints.setText("Clear Breakpoints");
354
355 fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
356 fActionClearDeletes.setText("Clear Deletes");
357
chudy@google.come504de02012-07-16 18:35:23 +0000358 fActionClose.setShortcuts(QKeySequence::Quit);
chudy@google.comc432f002012-07-10 13:19:25 +0000359 fActionClose.setText("Exit");
chudy@google.com902ebe52012-06-29 14:21:22 +0000360
chudy@google.come504de02012-07-16 18:35:23 +0000361 fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
362 fActionCreateBreakpoint.setText("Set Breakpoint");
363
364 fActionDelete.setShortcut(QKeySequence(tr("X")));
chudy@google.comc432f002012-07-10 13:19:25 +0000365 fActionDelete.setText("Delete Command");
chudy@google.com902ebe52012-06-29 14:21:22 +0000366
chudy@google.come504de02012-07-16 18:35:23 +0000367 fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
368 fActionDirectory.setText("Directory");
chudy@google.com902ebe52012-06-29 14:21:22 +0000369
chudy@google.comc432f002012-07-10 13:19:25 +0000370 QIcon inspector;
chudy@google.come504de02012-07-16 18:35:23 +0000371 inspector.addFile(QString::fromUtf8(":/images/Ico/inspector.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000372 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000373 fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
chudy@google.comc432f002012-07-10 13:19:25 +0000374 fActionInspector.setIcon(inspector);
chudy@google.come504de02012-07-16 18:35:23 +0000375 fActionInspector.setText("Inspector");
chudy@google.com902ebe52012-06-29 14:21:22 +0000376
chudy@google.comc432f002012-07-10 13:19:25 +0000377 QIcon play;
chudy@google.come504de02012-07-16 18:35:23 +0000378 play.addFile(QString::fromUtf8(":/images/Ico/play.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000379 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000380 fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
chudy@google.comc432f002012-07-10 13:19:25 +0000381 fActionPlay.setIcon(play);
382 fActionPlay.setText("Play");
chudy@google.com902ebe52012-06-29 14:21:22 +0000383
chudy@google.come504de02012-07-16 18:35:23 +0000384 QIcon pause;
385 pause.addFile(QString::fromUtf8(":/images/Ico/pause.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000386 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000387 fActionPause.setShortcut(QKeySequence(tr("Space")));
388 fActionPause.setCheckable(true);
389 fActionPause.setIcon(pause);
390 fActionPause.setText("Pause");
391
chudy@google.comc432f002012-07-10 13:19:25 +0000392 QIcon rewind;
chudy@google.come504de02012-07-16 18:35:23 +0000393 rewind.addFile(QString::fromUtf8(":/images/Ico/rewind.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000394 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000395 fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
chudy@google.comc432f002012-07-10 13:19:25 +0000396 fActionRewind.setIcon(rewind);
397 fActionRewind.setText("Rewind");
chudy@google.com902ebe52012-06-29 14:21:22 +0000398
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000399 fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
400 fActionShowDeletes.setText("Deleted Commands");
401
chudy@google.comc432f002012-07-10 13:19:25 +0000402 QIcon stepBack;
chudy@google.come504de02012-07-16 18:35:23 +0000403 stepBack.addFile(QString::fromUtf8(":/images/Ico/previous.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000404 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000405 fActionStepBack.setShortcut(QKeySequence(tr("[")));
chudy@google.comc432f002012-07-10 13:19:25 +0000406 fActionStepBack.setIcon(stepBack);
407 fActionStepBack.setText("Step Back");
chudy@google.com902ebe52012-06-29 14:21:22 +0000408
chudy@google.comc432f002012-07-10 13:19:25 +0000409 QIcon stepForward;
chudy@google.come504de02012-07-16 18:35:23 +0000410 stepForward.addFile(QString::fromUtf8(":/images/Ico/next.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000411 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000412 fActionStepForward.setShortcut(QKeySequence(tr("]")));
chudy@google.comc432f002012-07-10 13:19:25 +0000413 fActionStepForward.setIcon(stepForward);
414 fActionStepForward.setText("Step Forward");
415
416 fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
417 fListWidget.setObjectName(QString::fromUtf8("listWidget"));
418 fListWidget.setMaximumWidth(250);
419
420 fFilter.addItem("--Filter By Available Commands--");
421
422 fDirectoryWidget.setMaximumWidth(250);
423 fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
424
425 fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000426 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000427
chudy@google.comc432f002012-07-10 13:19:25 +0000428 fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000429 QSizePolicy::Expanding);
chudy@google.comc432f002012-07-10 13:19:25 +0000430 fInspectorWidget.setMaximumHeight(300);
chudy@google.com902ebe52012-06-29 14:21:22 +0000431
chudy@google.comc432f002012-07-10 13:19:25 +0000432 fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
433 QSizePolicy::Expanding);
434 fSettingsWidget.setMaximumWidth(250);
chudy@google.com902ebe52012-06-29 14:21:22 +0000435
chudy@google.comc432f002012-07-10 13:19:25 +0000436 fLeftColumnLayout.setSpacing(6);
437 fLeftColumnLayout.addWidget(&fListWidget);
438 fLeftColumnLayout.addWidget(&fDirectoryWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000439
chudy@google.comc432f002012-07-10 13:19:25 +0000440 fCanvasAndSettingsLayout.setSpacing(6);
441 fCanvasAndSettingsLayout.addWidget(&fCanvasWidget);
442 fCanvasAndSettingsLayout.addWidget(&fSettingsWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000443
chudy@google.comc432f002012-07-10 13:19:25 +0000444 fMainAndRightColumnLayout.setSpacing(6);
445 fMainAndRightColumnLayout.addLayout(&fCanvasAndSettingsLayout);
446 fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000447
chudy@google.comc432f002012-07-10 13:19:25 +0000448 fContainerLayout.setSpacing(6);
449 fContainerLayout.setContentsMargins(11, 11, 11, 11);
450 fContainerLayout.addLayout(&fLeftColumnLayout);
451 fContainerLayout.addLayout(&fMainAndRightColumnLayout);
452
453 SkDebuggerGUI->setCentralWidget(&fCentralWidget);
454 SkDebuggerGUI->setStatusBar(&fStatusBar);
455
chudy@google.come504de02012-07-16 18:35:23 +0000456 fToolBar.setIconSize(QSize(32, 32));
chudy@google.comc432f002012-07-10 13:19:25 +0000457 fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
458 SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000459
460 QWidget *spacer = new QWidget();
461 spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
462
chudy@google.comc432f002012-07-10 13:19:25 +0000463 fToolBar.addAction(&fActionRewind);
464 fToolBar.addAction(&fActionStepBack);
chudy@google.come504de02012-07-16 18:35:23 +0000465 fToolBar.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000466 fToolBar.addAction(&fActionStepForward);
467 fToolBar.addAction(&fActionPlay);
468 fToolBar.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000469 fToolBar.addAction(&fActionInspector);
chudy@google.comc432f002012-07-10 13:19:25 +0000470 fToolBar.addSeparator();
chudy@google.comc432f002012-07-10 13:19:25 +0000471 fToolBar.addWidget(spacer);
472 fToolBar.addWidget(&fFilter);
473 fToolBar.addAction(&fActionCancel);
chudy@google.com902ebe52012-06-29 14:21:22 +0000474
475 // TODO(chudy): Remove static call.
476 fDirectoryWidgetActive = false;
chudy@google.comea5488b2012-07-26 19:38:22 +0000477 fPath = "/usr/local/google/home/chudy/trunk-git/trunk/skp";
chudy@google.com902ebe52012-06-29 14:21:22 +0000478 setupDirectoryWidget();
479 fDirectoryWidgetActive = true;
480
chudy@google.com902ebe52012-06-29 14:21:22 +0000481 // Menu Bar
chudy@google.comc432f002012-07-10 13:19:25 +0000482 fMenuFile.setTitle("File");
483 fMenuFile.addAction(&fActionOpen);
484 fMenuFile.addAction(&fActionClose);
chudy@google.come504de02012-07-16 18:35:23 +0000485
486 fMenuEdit.setTitle("Edit");
487 fMenuEdit.addAction(&fActionDelete);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000488 fMenuEdit.addAction(&fActionClearDeletes);
489 fMenuEdit.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000490 fMenuEdit.addAction(&fActionCreateBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000491 fMenuEdit.addAction(&fActionClearBreakpoints);
chudy@google.come504de02012-07-16 18:35:23 +0000492
chudy@google.comc432f002012-07-10 13:19:25 +0000493 fMenuNavigate.setTitle("Navigate");
chudy@google.come504de02012-07-16 18:35:23 +0000494 fMenuNavigate.addAction(&fActionRewind);
495 fMenuNavigate.addAction(&fActionStepBack);
496 fMenuNavigate.addAction(&fActionStepForward);
497 fMenuNavigate.addAction(&fActionPlay);
498 fMenuNavigate.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000499 fMenuNavigate.addAction(&fActionGoToLine);
chudy@google.come504de02012-07-16 18:35:23 +0000500
chudy@google.comc432f002012-07-10 13:19:25 +0000501 fMenuView.setTitle("View");
chudy@google.come504de02012-07-16 18:35:23 +0000502 fMenuView.addAction(&fActionBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000503 fMenuView.addAction(&fActionShowDeletes);
chudy@google.come504de02012-07-16 18:35:23 +0000504
505 fMenuWindows.setTitle("Window");
506 fMenuWindows.addAction(&fActionInspector);
507 fMenuWindows.addAction(&fActionDirectory);
chudy@google.comc432f002012-07-10 13:19:25 +0000508
509 fActionGoToLine.setText("Go to Line...");
510 fActionGoToLine.setDisabled(true);
511 fMenuBar.addAction(fMenuFile.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000512 fMenuBar.addAction(fMenuEdit.menuAction());
chudy@google.comc432f002012-07-10 13:19:25 +0000513 fMenuBar.addAction(fMenuView.menuAction());
514 fMenuBar.addAction(fMenuNavigate.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000515 fMenuBar.addAction(fMenuWindows.menuAction());
chudy@google.com902ebe52012-06-29 14:21:22 +0000516
chudy@google.com7dcae672012-07-09 20:26:53 +0000517 fPause = false;
518
chudy@google.comc432f002012-07-10 13:19:25 +0000519 SkDebuggerGUI->setMenuBar(&fMenuBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000520 QMetaObject::connectSlotsByName(SkDebuggerGUI);
521}
522
523void SkDebuggerGUI::setupDirectoryWidget() {
chudy@google.comc432f002012-07-10 13:19:25 +0000524 QDir dir(fPath);
chudy@google.com902ebe52012-06-29 14:21:22 +0000525 QRegExp r(".skp");
chudy@google.comc432f002012-07-10 13:19:25 +0000526 fDirectoryWidget.clear();
527 const QStringList files = dir.entryList();
chudy@google.com902ebe52012-06-29 14:21:22 +0000528 foreach (QString f, files) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000529 if (f.contains(r))
chudy@google.comc432f002012-07-10 13:19:25 +0000530 fDirectoryWidget.addItem(f);
chudy@google.com902ebe52012-06-29 14:21:22 +0000531 }
532}
533
chudy@google.com902ebe52012-06-29 14:21:22 +0000534void SkDebuggerGUI::loadPicture(QString fileName) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000535 fLoading = true;
chudy@google.comc432f002012-07-10 13:19:25 +0000536 fCanvasWidget.loadPicture(fileName);
537 std::vector<std::string> *cv = fCanvasWidget.getDrawCommands();
chudy@google.com7dcae672012-07-09 20:26:53 +0000538 /* fDebugCanvas is reinitialized every load picture. Need it to retain value
539 * of the visibility filter. */
chudy@google.comc432f002012-07-10 13:19:25 +0000540 fCanvasWidget.toggleCurrentCommandFilter(
541 fSettingsWidget.getVisibilityButton()->isChecked());
chudy@google.com902ebe52012-06-29 14:21:22 +0000542 setupListWidget(cv);
543 setupComboBox(cv);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000544 fInspectorWidget.setDisabled(false);
chudy@google.come606d6e2012-07-12 14:31:25 +0000545 fSettingsWidget.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000546 fMenuEdit.setDisabled(false);
547 fMenuNavigate.setDisabled(false);
548 fMenuView.setDisabled(false);
549 fLoading = false;
550 actionPlay();
chudy@google.com902ebe52012-06-29 14:21:22 +0000551}
552
553void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000554 fListWidget.clear();
chudy@google.com902ebe52012-06-29 14:21:22 +0000555 int counter = 0;
556 for (unsigned int i = 0; i < cv->size(); i++) {
557 QListWidgetItem *item = new QListWidgetItem();
558 item->setData(Qt::DisplayRole, (*cv)[i].c_str());
559 item->setData(Qt::UserRole + 1, counter++);
chudy@google.comc432f002012-07-10 13:19:25 +0000560 fListWidget.addItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000561 }
562}
563
564void SkDebuggerGUI::setupComboBox(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000565 fFilter.clear();
566 fFilter.addItem("--Filter By Available Commands--");
chudy@google.com902ebe52012-06-29 14:21:22 +0000567
568 std::map<std::string, int> map;
569 for (unsigned int i = 0; i < cv->size(); i++) {
570 map[(*cv)[i]]++;
571 }
572
573 QString overview;
574 int counter;
chudy@google.com7dcae672012-07-09 20:26:53 +0000575 for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
576 ++it) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000577 overview.append((it->first).c_str());
578 overview.append(": ");
579 overview.append(QString::number(it->second));
580 overview.append("<br/>");
chudy@google.com7dcae672012-07-09 20:26:53 +0000581 counter += it->second;
chudy@google.comc432f002012-07-10 13:19:25 +0000582 fFilter.addItem((it->first).c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000583 }
584 QString total;
585 total.append("Total Draw Commands: ");
586 total.append(QString::number(counter));
587 total.append("<br/>");
588 overview.insert(0, total);
589
590 overview.append("<br/>");
591 overview.append("SkBitmap Width: ");
592 // NOTE(chudy): This is where we can pull out the SkPictures width.
chudy@google.comc432f002012-07-10 13:19:25 +0000593 overview.append(QString::number(fCanvasWidget.getBitmapWidth()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000594 overview.append("px<br/>");
595 overview.append("SkBitmap Height: ");
chudy@google.comc432f002012-07-10 13:19:25 +0000596 overview.append(QString::number(fCanvasWidget.getBitmapHeight()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000597 overview.append("px");
chudy@google.comc432f002012-07-10 13:19:25 +0000598 fInspectorWidget.setOverviewText(overview);
chudy@google.com902ebe52012-06-29 14:21:22 +0000599
600 // NOTE(chudy): Makes first item unselectable.
chudy@google.com7dcae672012-07-09 20:26:53 +0000601 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
chudy@google.comc432f002012-07-10 13:19:25 +0000602 fFilter.model());
603 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
604 fFilter.rootModelIndex());
chudy@google.com902ebe52012-06-29 14:21:22 +0000605 QStandardItem* firstItem = model->itemFromIndex(firstIndex);
606 firstItem->setSelectable(false);
607}