blob: 7448aeb280c8ba5189fb6c647d6a97fac40b0ade [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.comc432f002012-07-10 13:19:25 +000050 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,
chudy@google.com7dcae672012-07-09 20:26:53 +000051 QListWidgetItem*)), this,
52 SLOT(registerListClick(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000053 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
54 connect(&fActionDirectory, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000055 SLOT(toggleDirectory()));
chudy@google.comc432f002012-07-10 13:19:25 +000056 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*,
chudy@google.com7dcae672012-07-09 20:26:53 +000057 QListWidgetItem*)), this,
58 SLOT(loadFile(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000059 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
chudy@google.comc432f002012-07-10 13:19:25 +000060 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000061 SLOT(toggleBreakpoint()));
chudy@google.comc432f002012-07-10 13:19:25 +000062 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
63 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
64 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
65 connect(&fActionStepForward, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000066 SLOT(actionStepForward()));
chudy@google.comc432f002012-07-10 13:19:25 +000067 connect(&fActionBreakpoint, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000068 SLOT(actionBreakpoints()));
chudy@google.comc432f002012-07-10 13:19:25 +000069 connect(&fActionInspector, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000070 SLOT(actionInspector()));
chudy@google.come504de02012-07-16 18:35:23 +000071 connect(&fActionInspector, SIGNAL(triggered()), this,
72 SLOT(actionSettings()));
chudy@google.comc432f002012-07-10 13:19:25 +000073 connect(&fFilter, SIGNAL(activated(QString)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000074 SLOT(toggleFilter(QString)));
chudy@google.comc432f002012-07-10 13:19:25 +000075 connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000076 connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
77 connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
chudy@google.comc432f002012-07-10 13:19:25 +000078 connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
chudy@google.comc432f002012-07-10 13:19:25 +000079 connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000080 SLOT(actionCommandFilter()));
chudy@google.comc432f002012-07-10 13:19:25 +000081 connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000082 SLOT(actionScale(float)));
chudy@google.come504de02012-07-16 18:35:23 +000083 connect(&fActionPause, SIGNAL(toggled(bool)),
chudy@google.comf927f442012-07-10 14:36:14 +000084 this, SLOT(pauseDrawing(bool)));
chudy@google.comc432f002012-07-10 13:19:25 +000085 connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget,
chudy@google.com7dcae672012-07-09 20:26:53 +000086 SLOT(updateCommand(int)));
chudy@google.com9ca9bfe2012-07-12 21:58:14 +000087 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
chudy@google.come606d6e2012-07-12 14:31:25 +000088 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget,
89 SLOT(updateHit(int)));
chudy@google.come504de02012-07-16 18:35:23 +000090 connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000091 connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
92
93 fInspectorWidget.setDisabled(true);
chudy@google.comd3058f52012-07-19 13:41:27 +000094 //fMenuBar.setDisabled(true);
95 fMenuEdit.setDisabled(true);
96 fMenuNavigate.setDisabled(true);
97 fMenuView.setDisabled(true);
98
chudy@google.com902ebe52012-06-29 14:21:22 +000099}
100
101SkDebuggerGUI::~SkDebuggerGUI() {
102}
103
104void SkDebuggerGUI::actionBreakpoints() {
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000105 fBreakpointsActivated = !fBreakpointsActivated;
chudy@google.comc432f002012-07-10 13:19:25 +0000106 for (int row = 0; row < fListWidget.count(); row++) {
107 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000108 item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated);
109 }
110}
chudy@google.com902ebe52012-06-29 14:21:22 +0000111
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000112void SkDebuggerGUI::showDeletes() {
113 fDeletesActivated = !fDeletesActivated;
114 for (int row = 0; row < fListWidget.count(); row++) {
115 QListWidgetItem *item = fListWidget.item(row);
116 bool isVisible = fCanvasWidget.commandIsVisibleAtIndex(row);
117 item->setHidden(isVisible && fDeletesActivated);
chudy@google.com902ebe52012-06-29 14:21:22 +0000118 }
119}
120
121void SkDebuggerGUI::actionCancel() {
chudy@google.comc432f002012-07-10 13:19:25 +0000122 for (int row = 0; row < fListWidget.count(); row++) {
123 fListWidget.item(row)->setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000124 }
125}
126
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000127void SkDebuggerGUI::actionClearBreakpoints() {
128 for (int row = 0; row < fListWidget.count(); row++) {
129 QListWidgetItem* item = fListWidget.item(row);
130 item->setCheckState(Qt::Unchecked);
131 item->setData(Qt::DecorationRole,
132 QPixmap(":/images/Icons/blank.png"));
133 }
134}
135
136void SkDebuggerGUI::actionClearDeletes() {
137 for (int row = 0; row < fListWidget.count(); row++) {
138 QListWidgetItem* item = fListWidget.item(row);
139 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
140 fCanvasWidget.setCommandVisibliltyAtIndex(row, true);
141 }
142 if (fPause) {
143 fCanvasWidget.drawTo(fPausedRow);
144 } else {
145 fCanvasWidget.drawTo(fListWidget.currentRow());
146 }
147}
148
chudy@google.com902ebe52012-06-29 14:21:22 +0000149void SkDebuggerGUI::actionCommandFilter() {
chudy@google.comc432f002012-07-10 13:19:25 +0000150 fCanvasWidget.toggleCurrentCommandFilter(
151 fSettingsWidget.getVisibilityButton()->isChecked());
152 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com902ebe52012-06-29 14:21:22 +0000153}
154
155void SkDebuggerGUI::actionClose() {
156 this->close();
157}
158
159void SkDebuggerGUI::actionDelete() {
chudy@google.comc432f002012-07-10 13:19:25 +0000160 int currentRow = fListWidget.currentRow();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000161 QListWidgetItem* item = fListWidget.currentItem();
162
163 if (fCanvasWidget.commandIsVisibleAtIndex(currentRow)) {
164 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/delete.png"));
165 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, false);
166 } else {
167 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
168 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, true);
169 }
170
chudy@google.come504de02012-07-16 18:35:23 +0000171 if (fPause) {
172 fCanvasWidget.drawTo(fPausedRow);
173 } else {
174 fCanvasWidget.drawTo(currentRow);
175 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000176}
177
178void SkDebuggerGUI::actionInspector() {
chudy@google.comc432f002012-07-10 13:19:25 +0000179 if (fInspectorWidget.isHidden()) {
180 fInspectorWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000181 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000182 fInspectorWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000183 }
184}
185
186void SkDebuggerGUI::actionPlay() {
chudy@google.comc432f002012-07-10 13:19:25 +0000187 for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
chudy@google.com7dcae672012-07-09 20:26:53 +0000188 row++) {
chudy@google.comc432f002012-07-10 13:19:25 +0000189 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000190 if (item->checkState() == Qt::Checked) {
chudy@google.comc432f002012-07-10 13:19:25 +0000191 fListWidget.setCurrentItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000192 return;
193 }
194 }
chudy@google.comc432f002012-07-10 13:19:25 +0000195 fListWidget.setCurrentRow(fListWidget.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000196}
197
chudy@google.com902ebe52012-06-29 14:21:22 +0000198void SkDebuggerGUI::actionRewind() {
chudy@google.come504de02012-07-16 18:35:23 +0000199 fListWidget.setCurrentRow(0);
chudy@google.com902ebe52012-06-29 14:21:22 +0000200}
201
chudy@google.com7dcae672012-07-09 20:26:53 +0000202void SkDebuggerGUI::actionScale(float scaleFactor) {
chudy@google.comc432f002012-07-10 13:19:25 +0000203 fSettingsWidget.setZoomText(scaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000204}
205
chudy@google.com902ebe52012-06-29 14:21:22 +0000206void SkDebuggerGUI::actionSettings() {
chudy@google.comc432f002012-07-10 13:19:25 +0000207 if (fSettingsWidget.isHidden()) {
208 fSettingsWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000209 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000210 fSettingsWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000211 }
212}
213
214void SkDebuggerGUI::actionStepBack() {
chudy@google.comc432f002012-07-10 13:19:25 +0000215 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000216 if (currentRow != 0) {
chudy@google.comc432f002012-07-10 13:19:25 +0000217 fListWidget.setCurrentRow(currentRow - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000218 }
219}
220
221void SkDebuggerGUI::actionStepForward() {
chudy@google.comc432f002012-07-10 13:19:25 +0000222 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000223 QString curRow = QString::number(currentRow);
chudy@google.comc432f002012-07-10 13:19:25 +0000224 QString curCount = QString::number(fListWidget.count());
225 if (currentRow < fListWidget.count() - 1) {
226 fListWidget.setCurrentRow(currentRow + 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000227 }
228}
229
230void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
231 if (fDirectoryWidgetActive) {
232 QString fileName;
233 fileName.append(fPath);
234 fileName.append("/");
235 fileName.append(item->text());
236 loadPicture(fileName);
237 }
238}
239
240void SkDebuggerGUI::openFile() {
chudy@google.com7dcae672012-07-09 20:26:53 +0000241 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
242 tr("Files (*.*)"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000243 fDirectoryWidgetActive = false;
244 if (!fileName.isNull()) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000245 QFileInfo pathInfo(fileName);
246 fPath = pathInfo.path();
247 loadPicture(fileName);
248 setupDirectoryWidget();
249 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000250 fDirectoryWidgetActive = true;
251}
252
chudy@google.comc432f002012-07-10 13:19:25 +0000253void SkDebuggerGUI::pauseDrawing(bool isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000254 // Qt uses 0 for unchecked, 1 for partially enabled and 2 for checked.
chudy@google.comc432f002012-07-10 13:19:25 +0000255 if (isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000256 fPause = true;
chudy@google.com233e4b82012-07-12 14:38:49 +0000257 fPausedRow = fListWidget.currentRow();
chudy@google.com7dcae672012-07-09 20:26:53 +0000258 } else {
259 fPause = false;
chudy@google.comc432f002012-07-10 13:19:25 +0000260 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com7dcae672012-07-09 20:26:53 +0000261 }
262}
263
chudy@google.com902ebe52012-06-29 14:21:22 +0000264void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000265 if(!fLoading) {
266 int currentRow = fListWidget.currentRow();
267 if (!fPause) {
268 fCanvasWidget.drawTo(currentRow);
chudy@google.com902ebe52012-06-29 14:21:22 +0000269 }
chudy@google.comd3058f52012-07-19 13:41:27 +0000270 std::vector<std::string> *v = fCanvasWidget.getCurrentCommandInfo(
271 currentRow);
272
273 /* TODO(chudy): Add command type before parameters. Rename v
274 * to something more informative. */
275 if (v) {
276 std::vector<std::string>::iterator it;
277
278 QString info;
279 info.append("<b>Parameters: </b><br/>");
280 for (it = v->begin(); it != v->end(); ++it) {
281 info.append(QString((*it).c_str()));
282 info.append("<br/>");
283 }
284 fInspectorWidget.setDetailText(info);
285 fInspectorWidget.setDisabled(false);
286 fInspectorWidget.setMatrix(fCanvasWidget.getCurrentMatrix());
287 fInspectorWidget.setClip(fCanvasWidget.getCurrentClip());
288 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000289 }
290}
291
chudy@google.com9ca9bfe2012-07-12 21:58:14 +0000292void SkDebuggerGUI::selectCommand(int command) {
293 if (fPause) {
294 fListWidget.setCurrentRow(command);
295 }
296}
297
chudy@google.com902ebe52012-06-29 14:21:22 +0000298void SkDebuggerGUI::toggleBreakpoint() {
chudy@google.comc432f002012-07-10 13:19:25 +0000299 QListWidgetItem* item = fListWidget.currentItem();
chudy@google.com902ebe52012-06-29 14:21:22 +0000300 if (item->checkState() == Qt::Unchecked) {
301 item->setCheckState(Qt::Checked);
chudy@google.come565de42012-07-12 14:15:54 +0000302 item->setData(Qt::DecorationRole,
303 QPixmap(":/images/Icons/breakpoint_16x16.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000304 } else {
chudy@google.com902ebe52012-06-29 14:21:22 +0000305 item->setCheckState(Qt::Unchecked);
chudy@google.come565de42012-07-12 14:15:54 +0000306 item->setData(Qt::DecorationRole,
307 QPixmap(":/images/Icons/blank.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000308 }
309}
310
311void SkDebuggerGUI::toggleDirectory() {
chudy@google.comc432f002012-07-10 13:19:25 +0000312 if (fDirectoryWidget.isHidden()) {
313 fDirectoryWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000314 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000315 fDirectoryWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000316 }
317}
318
319void SkDebuggerGUI::toggleFilter(QString string) {
chudy@google.comc432f002012-07-10 13:19:25 +0000320 for (int row = 0; row < fListWidget.count(); row++) {
321 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000322 if (item->text() == string) {
323 item->setHidden(false);
324 } else {
325 item->setHidden(true);
326 }
327 }
328}
329
330void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
331 QIcon windowIcon;
chudy@google.com7dcae672012-07-09 20:26:53 +0000332 windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(),
333 QIcon::Normal, QIcon::Off);
chudy@google.com902ebe52012-06-29 14:21:22 +0000334 SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
335 SkDebuggerGUI->resize(1200, 1000);
336 SkDebuggerGUI->setWindowIcon(windowIcon);
chudy@google.comc432f002012-07-10 13:19:25 +0000337 SkDebuggerGUI->setWindowTitle("Skia Debugger");
chudy@google.com902ebe52012-06-29 14:21:22 +0000338
chudy@google.come504de02012-07-16 18:35:23 +0000339 fActionOpen.setShortcuts(QKeySequence::Open);
chudy@google.comc432f002012-07-10 13:19:25 +0000340 fActionOpen.setText("Open");
chudy@google.com902ebe52012-06-29 14:21:22 +0000341
342 QIcon breakpoint;
chudy@google.com7dcae672012-07-09 20:26:53 +0000343 breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"),
344 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000345 fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
chudy@google.comc432f002012-07-10 13:19:25 +0000346 fActionBreakpoint.setIcon(breakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000347 fActionBreakpoint.setText("Breakpoints");
chudy@google.com902ebe52012-06-29 14:21:22 +0000348
349 QIcon cancel;
chudy@google.come504de02012-07-16 18:35:23 +0000350 cancel.addFile(QString::fromUtf8(":/images/Ico/reload.png"), QSize(),
chudy@google.com7dcae672012-07-09 20:26:53 +0000351 QIcon::Normal, QIcon::Off);
chudy@google.comc432f002012-07-10 13:19:25 +0000352 fActionCancel.setIcon(cancel);
353 fActionCancel.setText("Clear Filter");
chudy@google.com902ebe52012-06-29 14:21:22 +0000354
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000355 fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
356 fActionClearBreakpoints.setText("Clear Breakpoints");
357
358 fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
359 fActionClearDeletes.setText("Clear Deletes");
360
chudy@google.come504de02012-07-16 18:35:23 +0000361 fActionClose.setShortcuts(QKeySequence::Quit);
chudy@google.comc432f002012-07-10 13:19:25 +0000362 fActionClose.setText("Exit");
chudy@google.com902ebe52012-06-29 14:21:22 +0000363
chudy@google.come504de02012-07-16 18:35:23 +0000364 fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
365 fActionCreateBreakpoint.setText("Set Breakpoint");
366
367 fActionDelete.setShortcut(QKeySequence(tr("X")));
chudy@google.comc432f002012-07-10 13:19:25 +0000368 fActionDelete.setText("Delete Command");
chudy@google.com902ebe52012-06-29 14:21:22 +0000369
chudy@google.come504de02012-07-16 18:35:23 +0000370 fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
371 fActionDirectory.setText("Directory");
chudy@google.com902ebe52012-06-29 14:21:22 +0000372
chudy@google.comc432f002012-07-10 13:19:25 +0000373 QIcon inspector;
chudy@google.come504de02012-07-16 18:35:23 +0000374 inspector.addFile(QString::fromUtf8(":/images/Ico/inspector.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000375 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000376 fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
chudy@google.comc432f002012-07-10 13:19:25 +0000377 fActionInspector.setIcon(inspector);
chudy@google.come504de02012-07-16 18:35:23 +0000378 fActionInspector.setText("Inspector");
chudy@google.com902ebe52012-06-29 14:21:22 +0000379
chudy@google.comc432f002012-07-10 13:19:25 +0000380 QIcon play;
chudy@google.come504de02012-07-16 18:35:23 +0000381 play.addFile(QString::fromUtf8(":/images/Ico/play.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000382 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000383 fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
chudy@google.comc432f002012-07-10 13:19:25 +0000384 fActionPlay.setIcon(play);
385 fActionPlay.setText("Play");
chudy@google.com902ebe52012-06-29 14:21:22 +0000386
chudy@google.come504de02012-07-16 18:35:23 +0000387 QIcon pause;
388 pause.addFile(QString::fromUtf8(":/images/Ico/pause.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000389 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000390 fActionPause.setShortcut(QKeySequence(tr("Space")));
391 fActionPause.setCheckable(true);
392 fActionPause.setIcon(pause);
393 fActionPause.setText("Pause");
394
chudy@google.comc432f002012-07-10 13:19:25 +0000395 QIcon rewind;
chudy@google.come504de02012-07-16 18:35:23 +0000396 rewind.addFile(QString::fromUtf8(":/images/Ico/rewind.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000397 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000398 fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
chudy@google.comc432f002012-07-10 13:19:25 +0000399 fActionRewind.setIcon(rewind);
400 fActionRewind.setText("Rewind");
chudy@google.com902ebe52012-06-29 14:21:22 +0000401
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000402 fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
403 fActionShowDeletes.setText("Deleted Commands");
404
chudy@google.comc432f002012-07-10 13:19:25 +0000405 QIcon stepBack;
chudy@google.come504de02012-07-16 18:35:23 +0000406 stepBack.addFile(QString::fromUtf8(":/images/Ico/previous.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000407 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000408 fActionStepBack.setShortcut(QKeySequence(tr("[")));
chudy@google.comc432f002012-07-10 13:19:25 +0000409 fActionStepBack.setIcon(stepBack);
410 fActionStepBack.setText("Step Back");
chudy@google.com902ebe52012-06-29 14:21:22 +0000411
chudy@google.comc432f002012-07-10 13:19:25 +0000412 QIcon stepForward;
chudy@google.come504de02012-07-16 18:35:23 +0000413 stepForward.addFile(QString::fromUtf8(":/images/Ico/next.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000414 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000415 fActionStepForward.setShortcut(QKeySequence(tr("]")));
chudy@google.comc432f002012-07-10 13:19:25 +0000416 fActionStepForward.setIcon(stepForward);
417 fActionStepForward.setText("Step Forward");
418
419 fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
420 fListWidget.setObjectName(QString::fromUtf8("listWidget"));
421 fListWidget.setMaximumWidth(250);
422
423 fFilter.addItem("--Filter By Available Commands--");
424
425 fDirectoryWidget.setMaximumWidth(250);
426 fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
427
428 fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000429 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000430
chudy@google.comc432f002012-07-10 13:19:25 +0000431 fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000432 QSizePolicy::Expanding);
chudy@google.comc432f002012-07-10 13:19:25 +0000433 fInspectorWidget.setMaximumHeight(300);
chudy@google.com902ebe52012-06-29 14:21:22 +0000434
chudy@google.comc432f002012-07-10 13:19:25 +0000435 fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
436 QSizePolicy::Expanding);
437 fSettingsWidget.setMaximumWidth(250);
chudy@google.com902ebe52012-06-29 14:21:22 +0000438
chudy@google.comc432f002012-07-10 13:19:25 +0000439 fLeftColumnLayout.setSpacing(6);
440 fLeftColumnLayout.addWidget(&fListWidget);
441 fLeftColumnLayout.addWidget(&fDirectoryWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000442
chudy@google.comc432f002012-07-10 13:19:25 +0000443 fCanvasAndSettingsLayout.setSpacing(6);
444 fCanvasAndSettingsLayout.addWidget(&fCanvasWidget);
445 fCanvasAndSettingsLayout.addWidget(&fSettingsWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000446
chudy@google.comc432f002012-07-10 13:19:25 +0000447 fMainAndRightColumnLayout.setSpacing(6);
448 fMainAndRightColumnLayout.addLayout(&fCanvasAndSettingsLayout);
449 fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000450
chudy@google.comc432f002012-07-10 13:19:25 +0000451 fContainerLayout.setSpacing(6);
452 fContainerLayout.setContentsMargins(11, 11, 11, 11);
453 fContainerLayout.addLayout(&fLeftColumnLayout);
454 fContainerLayout.addLayout(&fMainAndRightColumnLayout);
455
456 SkDebuggerGUI->setCentralWidget(&fCentralWidget);
457 SkDebuggerGUI->setStatusBar(&fStatusBar);
458
chudy@google.come504de02012-07-16 18:35:23 +0000459 fToolBar.setIconSize(QSize(32, 32));
chudy@google.comc432f002012-07-10 13:19:25 +0000460 fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
461 SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000462
463 QWidget *spacer = new QWidget();
464 spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
465
chudy@google.comc432f002012-07-10 13:19:25 +0000466 fToolBar.addAction(&fActionRewind);
467 fToolBar.addAction(&fActionStepBack);
chudy@google.come504de02012-07-16 18:35:23 +0000468 fToolBar.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000469 fToolBar.addAction(&fActionStepForward);
470 fToolBar.addAction(&fActionPlay);
471 fToolBar.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000472 fToolBar.addAction(&fActionInspector);
chudy@google.comc432f002012-07-10 13:19:25 +0000473 fToolBar.addSeparator();
chudy@google.comc432f002012-07-10 13:19:25 +0000474 fToolBar.addWidget(spacer);
475 fToolBar.addWidget(&fFilter);
476 fToolBar.addAction(&fActionCancel);
chudy@google.com902ebe52012-06-29 14:21:22 +0000477
478 // TODO(chudy): Remove static call.
479 fDirectoryWidgetActive = false;
chudy@google.com7dcae672012-07-09 20:26:53 +0000480 fPath = "/usr/local/google/home/chudy/trunk-linux/debugger/skp";
chudy@google.com902ebe52012-06-29 14:21:22 +0000481 setupDirectoryWidget();
482 fDirectoryWidgetActive = true;
483
chudy@google.com902ebe52012-06-29 14:21:22 +0000484 // Menu Bar
chudy@google.comc432f002012-07-10 13:19:25 +0000485 fMenuFile.setTitle("File");
486 fMenuFile.addAction(&fActionOpen);
487 fMenuFile.addAction(&fActionClose);
chudy@google.come504de02012-07-16 18:35:23 +0000488
489 fMenuEdit.setTitle("Edit");
490 fMenuEdit.addAction(&fActionDelete);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000491 fMenuEdit.addAction(&fActionClearDeletes);
492 fMenuEdit.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000493 fMenuEdit.addAction(&fActionCreateBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000494 fMenuEdit.addAction(&fActionClearBreakpoints);
chudy@google.come504de02012-07-16 18:35:23 +0000495
chudy@google.comc432f002012-07-10 13:19:25 +0000496 fMenuNavigate.setTitle("Navigate");
chudy@google.come504de02012-07-16 18:35:23 +0000497 fMenuNavigate.addAction(&fActionRewind);
498 fMenuNavigate.addAction(&fActionStepBack);
499 fMenuNavigate.addAction(&fActionStepForward);
500 fMenuNavigate.addAction(&fActionPlay);
501 fMenuNavigate.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000502 fMenuNavigate.addAction(&fActionGoToLine);
chudy@google.come504de02012-07-16 18:35:23 +0000503
chudy@google.comc432f002012-07-10 13:19:25 +0000504 fMenuView.setTitle("View");
chudy@google.come504de02012-07-16 18:35:23 +0000505 fMenuView.addAction(&fActionBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000506 fMenuView.addAction(&fActionShowDeletes);
chudy@google.come504de02012-07-16 18:35:23 +0000507
508 fMenuWindows.setTitle("Window");
509 fMenuWindows.addAction(&fActionInspector);
510 fMenuWindows.addAction(&fActionDirectory);
chudy@google.comc432f002012-07-10 13:19:25 +0000511
512 fActionGoToLine.setText("Go to Line...");
513 fActionGoToLine.setDisabled(true);
514 fMenuBar.addAction(fMenuFile.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000515 fMenuBar.addAction(fMenuEdit.menuAction());
chudy@google.comc432f002012-07-10 13:19:25 +0000516 fMenuBar.addAction(fMenuView.menuAction());
517 fMenuBar.addAction(fMenuNavigate.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000518 fMenuBar.addAction(fMenuWindows.menuAction());
chudy@google.com902ebe52012-06-29 14:21:22 +0000519
chudy@google.com7dcae672012-07-09 20:26:53 +0000520 fPause = false;
521
chudy@google.comc432f002012-07-10 13:19:25 +0000522 SkDebuggerGUI->setMenuBar(&fMenuBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000523 QMetaObject::connectSlotsByName(SkDebuggerGUI);
524}
525
526void SkDebuggerGUI::setupDirectoryWidget() {
chudy@google.comc432f002012-07-10 13:19:25 +0000527 QDir dir(fPath);
chudy@google.com902ebe52012-06-29 14:21:22 +0000528 QRegExp r(".skp");
chudy@google.comc432f002012-07-10 13:19:25 +0000529 fDirectoryWidget.clear();
530 const QStringList files = dir.entryList();
chudy@google.com902ebe52012-06-29 14:21:22 +0000531 foreach (QString f, files) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000532 if (f.contains(r))
chudy@google.comc432f002012-07-10 13:19:25 +0000533 fDirectoryWidget.addItem(f);
chudy@google.com902ebe52012-06-29 14:21:22 +0000534 }
535}
536
chudy@google.com902ebe52012-06-29 14:21:22 +0000537void SkDebuggerGUI::loadPicture(QString fileName) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000538 fLoading = true;
chudy@google.comc432f002012-07-10 13:19:25 +0000539 fCanvasWidget.loadPicture(fileName);
chudy@google.comd3058f52012-07-19 13:41:27 +0000540 std::string cocks = fileName.toStdString();
chudy@google.comc432f002012-07-10 13:19:25 +0000541 std::vector<std::string> *cv = fCanvasWidget.getDrawCommands();
chudy@google.com7dcae672012-07-09 20:26:53 +0000542 /* fDebugCanvas is reinitialized every load picture. Need it to retain value
543 * of the visibility filter. */
chudy@google.comc432f002012-07-10 13:19:25 +0000544 fCanvasWidget.toggleCurrentCommandFilter(
545 fSettingsWidget.getVisibilityButton()->isChecked());
chudy@google.com902ebe52012-06-29 14:21:22 +0000546 setupListWidget(cv);
547 setupComboBox(cv);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000548 fInspectorWidget.setDisabled(false);
chudy@google.come606d6e2012-07-12 14:31:25 +0000549 fSettingsWidget.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000550 fMenuEdit.setDisabled(false);
551 fMenuNavigate.setDisabled(false);
552 fMenuView.setDisabled(false);
553 fLoading = false;
554 actionPlay();
chudy@google.com902ebe52012-06-29 14:21:22 +0000555}
556
557void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000558 fListWidget.clear();
chudy@google.com902ebe52012-06-29 14:21:22 +0000559 int counter = 0;
560 for (unsigned int i = 0; i < cv->size(); i++) {
561 QListWidgetItem *item = new QListWidgetItem();
562 item->setData(Qt::DisplayRole, (*cv)[i].c_str());
563 item->setData(Qt::UserRole + 1, counter++);
chudy@google.comc432f002012-07-10 13:19:25 +0000564 fListWidget.addItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000565 }
566}
567
568void SkDebuggerGUI::setupComboBox(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000569 fFilter.clear();
570 fFilter.addItem("--Filter By Available Commands--");
chudy@google.com902ebe52012-06-29 14:21:22 +0000571
572 std::map<std::string, int> map;
573 for (unsigned int i = 0; i < cv->size(); i++) {
574 map[(*cv)[i]]++;
575 }
576
577 QString overview;
578 int counter;
chudy@google.com7dcae672012-07-09 20:26:53 +0000579 for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
580 ++it) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000581 overview.append((it->first).c_str());
582 overview.append(": ");
583 overview.append(QString::number(it->second));
584 overview.append("<br/>");
chudy@google.com7dcae672012-07-09 20:26:53 +0000585 counter += it->second;
chudy@google.comc432f002012-07-10 13:19:25 +0000586 fFilter.addItem((it->first).c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000587 }
588 QString total;
589 total.append("Total Draw Commands: ");
590 total.append(QString::number(counter));
591 total.append("<br/>");
592 overview.insert(0, total);
593
594 overview.append("<br/>");
595 overview.append("SkBitmap Width: ");
596 // NOTE(chudy): This is where we can pull out the SkPictures width.
chudy@google.comc432f002012-07-10 13:19:25 +0000597 overview.append(QString::number(fCanvasWidget.getBitmapWidth()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000598 overview.append("px<br/>");
599 overview.append("SkBitmap Height: ");
chudy@google.comc432f002012-07-10 13:19:25 +0000600 overview.append(QString::number(fCanvasWidget.getBitmapHeight()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000601 overview.append("px");
chudy@google.comc432f002012-07-10 13:19:25 +0000602 fInspectorWidget.setOverviewText(overview);
chudy@google.com902ebe52012-06-29 14:21:22 +0000603
604 // NOTE(chudy): Makes first item unselectable.
chudy@google.com7dcae672012-07-09 20:26:53 +0000605 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
chudy@google.comc432f002012-07-10 13:19:25 +0000606 fFilter.model());
607 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
608 fFilter.rootModelIndex());
chudy@google.com902ebe52012-06-29 14:21:22 +0000609 QStandardItem* firstItem = model->itemFromIndex(firstIndex);
610 firstItem->setSelectable(false);
611}