blob: ea9d687b85b9dc84488906d531dcff1a0dcb687e [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.comc432f002012-07-10 13:19:25 +000047{
chudy@google.com902ebe52012-06-29 14:21:22 +000048 setupUi(this);
chudy@google.comc432f002012-07-10 13:19:25 +000049 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,
chudy@google.com7dcae672012-07-09 20:26:53 +000050 QListWidgetItem*)), this,
51 SLOT(registerListClick(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000052 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
53 connect(&fActionDirectory, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000054 SLOT(toggleDirectory()));
chudy@google.comc432f002012-07-10 13:19:25 +000055 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*,
chudy@google.com7dcae672012-07-09 20:26:53 +000056 QListWidgetItem*)), this,
57 SLOT(loadFile(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000058 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
chudy@google.comc432f002012-07-10 13:19:25 +000059 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000060 SLOT(toggleBreakpoint()));
chudy@google.comc432f002012-07-10 13:19:25 +000061 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
62 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
63 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
64 connect(&fActionStepForward, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000065 SLOT(actionStepForward()));
chudy@google.comc432f002012-07-10 13:19:25 +000066 connect(&fActionBreakpoint, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000067 SLOT(actionBreakpoints()));
chudy@google.comc432f002012-07-10 13:19:25 +000068 connect(&fActionInspector, SIGNAL(triggered()), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000069 SLOT(actionInspector()));
chudy@google.come504de02012-07-16 18:35:23 +000070 connect(&fActionInspector, SIGNAL(triggered()), this,
71 SLOT(actionSettings()));
chudy@google.comc432f002012-07-10 13:19:25 +000072 connect(&fFilter, SIGNAL(activated(QString)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000073 SLOT(toggleFilter(QString)));
chudy@google.comc432f002012-07-10 13:19:25 +000074 connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000075 connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
76 connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
chudy@google.comc432f002012-07-10 13:19:25 +000077 connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
chudy@google.comc432f002012-07-10 13:19:25 +000078 connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000079 SLOT(actionCommandFilter()));
chudy@google.comc432f002012-07-10 13:19:25 +000080 connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this,
chudy@google.com7dcae672012-07-09 20:26:53 +000081 SLOT(actionScale(float)));
chudy@google.come504de02012-07-16 18:35:23 +000082 connect(&fActionPause, SIGNAL(toggled(bool)),
chudy@google.comf927f442012-07-10 14:36:14 +000083 this, SLOT(pauseDrawing(bool)));
chudy@google.comc432f002012-07-10 13:19:25 +000084 connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget,
chudy@google.com7dcae672012-07-09 20:26:53 +000085 SLOT(updateCommand(int)));
chudy@google.com9ca9bfe2012-07-12 21:58:14 +000086 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
chudy@google.come606d6e2012-07-12 14:31:25 +000087 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget,
88 SLOT(updateHit(int)));
chudy@google.come504de02012-07-16 18:35:23 +000089 connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000090 connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
91
92 fInspectorWidget.setDisabled(true);
93 fMenuBar.setDisabled(true);
chudy@google.com902ebe52012-06-29 14:21:22 +000094}
95
96SkDebuggerGUI::~SkDebuggerGUI() {
97}
98
99void SkDebuggerGUI::actionBreakpoints() {
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000100 fBreakpointsActivated = !fBreakpointsActivated;
chudy@google.comc432f002012-07-10 13:19:25 +0000101 for (int row = 0; row < fListWidget.count(); row++) {
102 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000103 item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated);
104 }
105}
chudy@google.com902ebe52012-06-29 14:21:22 +0000106
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000107void SkDebuggerGUI::showDeletes() {
108 fDeletesActivated = !fDeletesActivated;
109 for (int row = 0; row < fListWidget.count(); row++) {
110 QListWidgetItem *item = fListWidget.item(row);
111 bool isVisible = fCanvasWidget.commandIsVisibleAtIndex(row);
112 item->setHidden(isVisible && fDeletesActivated);
chudy@google.com902ebe52012-06-29 14:21:22 +0000113 }
114}
115
116void SkDebuggerGUI::actionCancel() {
chudy@google.comc432f002012-07-10 13:19:25 +0000117 for (int row = 0; row < fListWidget.count(); row++) {
118 fListWidget.item(row)->setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000119 }
120}
121
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000122void SkDebuggerGUI::actionClearBreakpoints() {
123 for (int row = 0; row < fListWidget.count(); row++) {
124 QListWidgetItem* item = fListWidget.item(row);
125 item->setCheckState(Qt::Unchecked);
126 item->setData(Qt::DecorationRole,
127 QPixmap(":/images/Icons/blank.png"));
128 }
129}
130
131void SkDebuggerGUI::actionClearDeletes() {
132 for (int row = 0; row < fListWidget.count(); row++) {
133 QListWidgetItem* item = fListWidget.item(row);
134 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
135 fCanvasWidget.setCommandVisibliltyAtIndex(row, true);
136 }
137 if (fPause) {
138 fCanvasWidget.drawTo(fPausedRow);
139 } else {
140 fCanvasWidget.drawTo(fListWidget.currentRow());
141 }
142}
143
chudy@google.com902ebe52012-06-29 14:21:22 +0000144void SkDebuggerGUI::actionCommandFilter() {
chudy@google.comc432f002012-07-10 13:19:25 +0000145 fCanvasWidget.toggleCurrentCommandFilter(
146 fSettingsWidget.getVisibilityButton()->isChecked());
147 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com902ebe52012-06-29 14:21:22 +0000148}
149
150void SkDebuggerGUI::actionClose() {
151 this->close();
152}
153
154void SkDebuggerGUI::actionDelete() {
chudy@google.comc432f002012-07-10 13:19:25 +0000155 int currentRow = fListWidget.currentRow();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000156 QListWidgetItem* item = fListWidget.currentItem();
157
158 if (fCanvasWidget.commandIsVisibleAtIndex(currentRow)) {
159 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/delete.png"));
160 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, false);
161 } else {
162 item->setData(Qt::UserRole + 2, QPixmap(":/images/Icons/blank.png"));
163 fCanvasWidget.setCommandVisibliltyAtIndex(currentRow, true);
164 }
165
chudy@google.come504de02012-07-16 18:35:23 +0000166 if (fPause) {
167 fCanvasWidget.drawTo(fPausedRow);
168 } else {
169 fCanvasWidget.drawTo(currentRow);
170 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000171}
172
173void SkDebuggerGUI::actionInspector() {
chudy@google.comc432f002012-07-10 13:19:25 +0000174 if (fInspectorWidget.isHidden()) {
175 fInspectorWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000176 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000177 fInspectorWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000178 }
179}
180
181void SkDebuggerGUI::actionPlay() {
chudy@google.comc432f002012-07-10 13:19:25 +0000182 for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
chudy@google.com7dcae672012-07-09 20:26:53 +0000183 row++) {
chudy@google.comc432f002012-07-10 13:19:25 +0000184 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000185 if (item->checkState() == Qt::Checked) {
chudy@google.comc432f002012-07-10 13:19:25 +0000186 fListWidget.setCurrentItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000187 return;
188 }
189 }
chudy@google.comc432f002012-07-10 13:19:25 +0000190 fListWidget.setCurrentRow(fListWidget.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000191}
192
chudy@google.com902ebe52012-06-29 14:21:22 +0000193void SkDebuggerGUI::actionRewind() {
chudy@google.come504de02012-07-16 18:35:23 +0000194 fListWidget.setCurrentRow(0);
chudy@google.com902ebe52012-06-29 14:21:22 +0000195}
196
chudy@google.com7dcae672012-07-09 20:26:53 +0000197void SkDebuggerGUI::actionScale(float scaleFactor) {
chudy@google.comc432f002012-07-10 13:19:25 +0000198 fSettingsWidget.setZoomText(scaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000199}
200
chudy@google.com902ebe52012-06-29 14:21:22 +0000201void SkDebuggerGUI::actionSettings() {
chudy@google.comc432f002012-07-10 13:19:25 +0000202 if (fSettingsWidget.isHidden()) {
203 fSettingsWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000204 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000205 fSettingsWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000206 }
207}
208
209void SkDebuggerGUI::actionStepBack() {
chudy@google.comc432f002012-07-10 13:19:25 +0000210 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000211 if (currentRow != 0) {
chudy@google.comc432f002012-07-10 13:19:25 +0000212 fListWidget.setCurrentRow(currentRow - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000213 }
214}
215
216void SkDebuggerGUI::actionStepForward() {
chudy@google.comc432f002012-07-10 13:19:25 +0000217 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000218 QString curRow = QString::number(currentRow);
chudy@google.comc432f002012-07-10 13:19:25 +0000219 QString curCount = QString::number(fListWidget.count());
220 if (currentRow < fListWidget.count() - 1) {
221 fListWidget.setCurrentRow(currentRow + 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000222 }
223}
224
225void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
226 if (fDirectoryWidgetActive) {
227 QString fileName;
228 fileName.append(fPath);
229 fileName.append("/");
230 fileName.append(item->text());
231 loadPicture(fileName);
232 }
233}
234
235void SkDebuggerGUI::openFile() {
chudy@google.com7dcae672012-07-09 20:26:53 +0000236 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
237 tr("Files (*.*)"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000238 fDirectoryWidgetActive = false;
239 if (!fileName.isNull()) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000240 QFileInfo pathInfo(fileName);
241 fPath = pathInfo.path();
242 loadPicture(fileName);
243 setupDirectoryWidget();
244 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000245 fDirectoryWidgetActive = true;
246}
247
chudy@google.comc432f002012-07-10 13:19:25 +0000248void SkDebuggerGUI::pauseDrawing(bool isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000249 // Qt uses 0 for unchecked, 1 for partially enabled and 2 for checked.
chudy@google.comc432f002012-07-10 13:19:25 +0000250 if (isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000251 fPause = true;
chudy@google.com233e4b82012-07-12 14:38:49 +0000252 fPausedRow = fListWidget.currentRow();
chudy@google.com7dcae672012-07-09 20:26:53 +0000253 } else {
254 fPause = false;
chudy@google.comc432f002012-07-10 13:19:25 +0000255 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com7dcae672012-07-09 20:26:53 +0000256 }
257}
258
chudy@google.com902ebe52012-06-29 14:21:22 +0000259void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
chudy@google.comc432f002012-07-10 13:19:25 +0000260 int currentRow = fListWidget.currentRow();
chudy@google.com7dcae672012-07-09 20:26:53 +0000261 if (!fPause) {
chudy@google.comc432f002012-07-10 13:19:25 +0000262 fCanvasWidget.drawTo(currentRow);
chudy@google.com7dcae672012-07-09 20:26:53 +0000263 }
chudy@google.comc432f002012-07-10 13:19:25 +0000264 std::vector<std::string> *v = fCanvasWidget.getCurrentCommandInfo(
chudy@google.com7dcae672012-07-09 20:26:53 +0000265 currentRow);
chudy@google.com902ebe52012-06-29 14:21:22 +0000266
chudy@google.com7dcae672012-07-09 20:26:53 +0000267 /* TODO(chudy): Add command type before parameters. Rename v
268 * to something more informative. */
269 if (v) {
270 std::vector<std::string>::iterator it;
chudy@google.com902ebe52012-06-29 14:21:22 +0000271
chudy@google.com7dcae672012-07-09 20:26:53 +0000272 QString info;
273 info.append("<b>Parameters: </b><br/>");
274 for (it = v->begin(); it != v->end(); ++it) {
275 info.append(QString((*it).c_str()));
276 info.append("<br/>");
chudy@google.com902ebe52012-06-29 14:21:22 +0000277 }
chudy@google.comc432f002012-07-10 13:19:25 +0000278 fInspectorWidget.setDetailText(info);
279 fInspectorWidget.setDisabled(false);
280 fInspectorWidget.setMatrix(fCanvasWidget.getCurrentMatrix());
281 fInspectorWidget.setClip(fCanvasWidget.getCurrentClip());
chudy@google.com902ebe52012-06-29 14:21:22 +0000282 }
283}
284
chudy@google.com9ca9bfe2012-07-12 21:58:14 +0000285void SkDebuggerGUI::selectCommand(int command) {
286 if (fPause) {
287 fListWidget.setCurrentRow(command);
288 }
289}
290
chudy@google.com902ebe52012-06-29 14:21:22 +0000291void SkDebuggerGUI::toggleBreakpoint() {
chudy@google.comc432f002012-07-10 13:19:25 +0000292 QListWidgetItem* item = fListWidget.currentItem();
chudy@google.com902ebe52012-06-29 14:21:22 +0000293 if (item->checkState() == Qt::Unchecked) {
294 item->setCheckState(Qt::Checked);
chudy@google.come565de42012-07-12 14:15:54 +0000295 item->setData(Qt::DecorationRole,
296 QPixmap(":/images/Icons/breakpoint_16x16.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000297 } else {
chudy@google.com902ebe52012-06-29 14:21:22 +0000298 item->setCheckState(Qt::Unchecked);
chudy@google.come565de42012-07-12 14:15:54 +0000299 item->setData(Qt::DecorationRole,
300 QPixmap(":/images/Icons/blank.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000301 }
302}
303
304void SkDebuggerGUI::toggleDirectory() {
chudy@google.comc432f002012-07-10 13:19:25 +0000305 if (fDirectoryWidget.isHidden()) {
306 fDirectoryWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000307 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000308 fDirectoryWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000309 }
310}
311
312void SkDebuggerGUI::toggleFilter(QString string) {
chudy@google.comc432f002012-07-10 13:19:25 +0000313 for (int row = 0; row < fListWidget.count(); row++) {
314 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000315 if (item->text() == string) {
316 item->setHidden(false);
317 } else {
318 item->setHidden(true);
319 }
320 }
321}
322
323void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
324 QIcon windowIcon;
chudy@google.com7dcae672012-07-09 20:26:53 +0000325 windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(),
326 QIcon::Normal, QIcon::Off);
chudy@google.com902ebe52012-06-29 14:21:22 +0000327 SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
328 SkDebuggerGUI->resize(1200, 1000);
329 SkDebuggerGUI->setWindowIcon(windowIcon);
chudy@google.comc432f002012-07-10 13:19:25 +0000330 SkDebuggerGUI->setWindowTitle("Skia Debugger");
chudy@google.com902ebe52012-06-29 14:21:22 +0000331
chudy@google.come504de02012-07-16 18:35:23 +0000332 fActionOpen.setShortcuts(QKeySequence::Open);
chudy@google.comc432f002012-07-10 13:19:25 +0000333 fActionOpen.setText("Open");
chudy@google.com902ebe52012-06-29 14:21:22 +0000334
335 QIcon breakpoint;
chudy@google.com7dcae672012-07-09 20:26:53 +0000336 breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"),
337 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000338 fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
chudy@google.comc432f002012-07-10 13:19:25 +0000339 fActionBreakpoint.setIcon(breakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000340 fActionBreakpoint.setText("Breakpoints");
chudy@google.com902ebe52012-06-29 14:21:22 +0000341
342 QIcon cancel;
chudy@google.come504de02012-07-16 18:35:23 +0000343 cancel.addFile(QString::fromUtf8(":/images/Ico/reload.png"), QSize(),
chudy@google.com7dcae672012-07-09 20:26:53 +0000344 QIcon::Normal, QIcon::Off);
chudy@google.comc432f002012-07-10 13:19:25 +0000345 fActionCancel.setIcon(cancel);
346 fActionCancel.setText("Clear Filter");
chudy@google.com902ebe52012-06-29 14:21:22 +0000347
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000348 fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
349 fActionClearBreakpoints.setText("Clear Breakpoints");
350
351 fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
352 fActionClearDeletes.setText("Clear Deletes");
353
chudy@google.come504de02012-07-16 18:35:23 +0000354 fActionClose.setShortcuts(QKeySequence::Quit);
chudy@google.comc432f002012-07-10 13:19:25 +0000355 fActionClose.setText("Exit");
chudy@google.com902ebe52012-06-29 14:21:22 +0000356
chudy@google.come504de02012-07-16 18:35:23 +0000357 fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
358 fActionCreateBreakpoint.setText("Set Breakpoint");
359
360 fActionDelete.setShortcut(QKeySequence(tr("X")));
chudy@google.comc432f002012-07-10 13:19:25 +0000361 fActionDelete.setText("Delete Command");
chudy@google.com902ebe52012-06-29 14:21:22 +0000362
chudy@google.come504de02012-07-16 18:35:23 +0000363 fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
364 fActionDirectory.setText("Directory");
chudy@google.com902ebe52012-06-29 14:21:22 +0000365
chudy@google.comc432f002012-07-10 13:19:25 +0000366 QIcon inspector;
chudy@google.come504de02012-07-16 18:35:23 +0000367 inspector.addFile(QString::fromUtf8(":/images/Ico/inspector.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000368 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000369 fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
chudy@google.comc432f002012-07-10 13:19:25 +0000370 fActionInspector.setIcon(inspector);
chudy@google.come504de02012-07-16 18:35:23 +0000371 fActionInspector.setText("Inspector");
chudy@google.com902ebe52012-06-29 14:21:22 +0000372
chudy@google.comc432f002012-07-10 13:19:25 +0000373 QIcon play;
chudy@google.come504de02012-07-16 18:35:23 +0000374 play.addFile(QString::fromUtf8(":/images/Ico/play.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000375 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000376 fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
chudy@google.comc432f002012-07-10 13:19:25 +0000377 fActionPlay.setIcon(play);
378 fActionPlay.setText("Play");
chudy@google.com902ebe52012-06-29 14:21:22 +0000379
chudy@google.come504de02012-07-16 18:35:23 +0000380 QIcon pause;
381 pause.addFile(QString::fromUtf8(":/images/Ico/pause.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000382 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000383 fActionPause.setShortcut(QKeySequence(tr("Space")));
384 fActionPause.setCheckable(true);
385 fActionPause.setIcon(pause);
386 fActionPause.setText("Pause");
387
chudy@google.comc432f002012-07-10 13:19:25 +0000388 QIcon rewind;
chudy@google.come504de02012-07-16 18:35:23 +0000389 rewind.addFile(QString::fromUtf8(":/images/Ico/rewind.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000390 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000391 fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
chudy@google.comc432f002012-07-10 13:19:25 +0000392 fActionRewind.setIcon(rewind);
393 fActionRewind.setText("Rewind");
chudy@google.com902ebe52012-06-29 14:21:22 +0000394
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000395 fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
396 fActionShowDeletes.setText("Deleted Commands");
397
chudy@google.comc432f002012-07-10 13:19:25 +0000398 QIcon stepBack;
chudy@google.come504de02012-07-16 18:35:23 +0000399 stepBack.addFile(QString::fromUtf8(":/images/Ico/previous.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000400 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000401 fActionStepBack.setShortcut(QKeySequence(tr("[")));
chudy@google.comc432f002012-07-10 13:19:25 +0000402 fActionStepBack.setIcon(stepBack);
403 fActionStepBack.setText("Step Back");
chudy@google.com902ebe52012-06-29 14:21:22 +0000404
chudy@google.comc432f002012-07-10 13:19:25 +0000405 QIcon stepForward;
chudy@google.come504de02012-07-16 18:35:23 +0000406 stepForward.addFile(QString::fromUtf8(":/images/Ico/next.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000407 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000408 fActionStepForward.setShortcut(QKeySequence(tr("]")));
chudy@google.comc432f002012-07-10 13:19:25 +0000409 fActionStepForward.setIcon(stepForward);
410 fActionStepForward.setText("Step Forward");
411
412 fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
413 fListWidget.setObjectName(QString::fromUtf8("listWidget"));
414 fListWidget.setMaximumWidth(250);
415
416 fFilter.addItem("--Filter By Available Commands--");
417
418 fDirectoryWidget.setMaximumWidth(250);
419 fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
420
421 fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000422 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000423
chudy@google.comc432f002012-07-10 13:19:25 +0000424 fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000425 QSizePolicy::Expanding);
chudy@google.comc432f002012-07-10 13:19:25 +0000426 fInspectorWidget.setMaximumHeight(300);
chudy@google.com902ebe52012-06-29 14:21:22 +0000427
chudy@google.comc432f002012-07-10 13:19:25 +0000428 fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
429 QSizePolicy::Expanding);
430 fSettingsWidget.setMaximumWidth(250);
chudy@google.com902ebe52012-06-29 14:21:22 +0000431
chudy@google.comc432f002012-07-10 13:19:25 +0000432 fLeftColumnLayout.setSpacing(6);
433 fLeftColumnLayout.addWidget(&fListWidget);
434 fLeftColumnLayout.addWidget(&fDirectoryWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000435
chudy@google.comc432f002012-07-10 13:19:25 +0000436 fCanvasAndSettingsLayout.setSpacing(6);
437 fCanvasAndSettingsLayout.addWidget(&fCanvasWidget);
438 fCanvasAndSettingsLayout.addWidget(&fSettingsWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000439
chudy@google.comc432f002012-07-10 13:19:25 +0000440 fMainAndRightColumnLayout.setSpacing(6);
441 fMainAndRightColumnLayout.addLayout(&fCanvasAndSettingsLayout);
442 fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000443
chudy@google.comc432f002012-07-10 13:19:25 +0000444 fContainerLayout.setSpacing(6);
445 fContainerLayout.setContentsMargins(11, 11, 11, 11);
446 fContainerLayout.addLayout(&fLeftColumnLayout);
447 fContainerLayout.addLayout(&fMainAndRightColumnLayout);
448
449 SkDebuggerGUI->setCentralWidget(&fCentralWidget);
450 SkDebuggerGUI->setStatusBar(&fStatusBar);
451
chudy@google.come504de02012-07-16 18:35:23 +0000452 fToolBar.setIconSize(QSize(32, 32));
chudy@google.comc432f002012-07-10 13:19:25 +0000453 fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
454 SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000455
456 QWidget *spacer = new QWidget();
457 spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
458
chudy@google.comc432f002012-07-10 13:19:25 +0000459 fToolBar.addAction(&fActionRewind);
460 fToolBar.addAction(&fActionStepBack);
chudy@google.come504de02012-07-16 18:35:23 +0000461 fToolBar.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000462 fToolBar.addAction(&fActionStepForward);
463 fToolBar.addAction(&fActionPlay);
464 fToolBar.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000465 fToolBar.addAction(&fActionInspector);
chudy@google.comc432f002012-07-10 13:19:25 +0000466 fToolBar.addSeparator();
chudy@google.comc432f002012-07-10 13:19:25 +0000467 fToolBar.addWidget(spacer);
468 fToolBar.addWidget(&fFilter);
469 fToolBar.addAction(&fActionCancel);
chudy@google.com902ebe52012-06-29 14:21:22 +0000470
471 // TODO(chudy): Remove static call.
472 fDirectoryWidgetActive = false;
chudy@google.com7dcae672012-07-09 20:26:53 +0000473 fPath = "/usr/local/google/home/chudy/trunk-linux/debugger/skp";
chudy@google.com902ebe52012-06-29 14:21:22 +0000474 setupDirectoryWidget();
475 fDirectoryWidgetActive = true;
476
chudy@google.com902ebe52012-06-29 14:21:22 +0000477 // Menu Bar
chudy@google.comc432f002012-07-10 13:19:25 +0000478 fMenuFile.setTitle("File");
479 fMenuFile.addAction(&fActionOpen);
480 fMenuFile.addAction(&fActionClose);
chudy@google.come504de02012-07-16 18:35:23 +0000481
482 fMenuEdit.setTitle("Edit");
483 fMenuEdit.addAction(&fActionDelete);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000484 fMenuEdit.addAction(&fActionClearDeletes);
485 fMenuEdit.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000486 fMenuEdit.addAction(&fActionCreateBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000487 fMenuEdit.addAction(&fActionClearBreakpoints);
chudy@google.come504de02012-07-16 18:35:23 +0000488
chudy@google.comc432f002012-07-10 13:19:25 +0000489 fMenuNavigate.setTitle("Navigate");
chudy@google.come504de02012-07-16 18:35:23 +0000490 fMenuNavigate.addAction(&fActionRewind);
491 fMenuNavigate.addAction(&fActionStepBack);
492 fMenuNavigate.addAction(&fActionStepForward);
493 fMenuNavigate.addAction(&fActionPlay);
494 fMenuNavigate.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000495 fMenuNavigate.addAction(&fActionGoToLine);
chudy@google.come504de02012-07-16 18:35:23 +0000496
chudy@google.comc432f002012-07-10 13:19:25 +0000497 fMenuView.setTitle("View");
chudy@google.come504de02012-07-16 18:35:23 +0000498 fMenuView.addAction(&fActionBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000499 fMenuView.addAction(&fActionShowDeletes);
chudy@google.come504de02012-07-16 18:35:23 +0000500
501 fMenuWindows.setTitle("Window");
502 fMenuWindows.addAction(&fActionInspector);
503 fMenuWindows.addAction(&fActionDirectory);
chudy@google.comc432f002012-07-10 13:19:25 +0000504
505 fActionGoToLine.setText("Go to Line...");
506 fActionGoToLine.setDisabled(true);
507 fMenuBar.addAction(fMenuFile.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000508 fMenuBar.addAction(fMenuEdit.menuAction());
chudy@google.comc432f002012-07-10 13:19:25 +0000509 fMenuBar.addAction(fMenuView.menuAction());
510 fMenuBar.addAction(fMenuNavigate.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000511 fMenuBar.addAction(fMenuWindows.menuAction());
chudy@google.com902ebe52012-06-29 14:21:22 +0000512
chudy@google.com7dcae672012-07-09 20:26:53 +0000513 fPause = false;
514
chudy@google.comc432f002012-07-10 13:19:25 +0000515 SkDebuggerGUI->setMenuBar(&fMenuBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000516 QMetaObject::connectSlotsByName(SkDebuggerGUI);
517}
518
519void SkDebuggerGUI::setupDirectoryWidget() {
chudy@google.comc432f002012-07-10 13:19:25 +0000520 QDir dir(fPath);
chudy@google.com902ebe52012-06-29 14:21:22 +0000521 QRegExp r(".skp");
chudy@google.comc432f002012-07-10 13:19:25 +0000522 fDirectoryWidget.clear();
523 const QStringList files = dir.entryList();
chudy@google.com902ebe52012-06-29 14:21:22 +0000524 foreach (QString f, files) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000525 if (f.contains(r))
chudy@google.comc432f002012-07-10 13:19:25 +0000526 fDirectoryWidget.addItem(f);
chudy@google.com902ebe52012-06-29 14:21:22 +0000527 }
528}
529
chudy@google.com902ebe52012-06-29 14:21:22 +0000530void SkDebuggerGUI::loadPicture(QString fileName) {
chudy@google.comc432f002012-07-10 13:19:25 +0000531 fCanvasWidget.loadPicture(fileName);
532 std::vector<std::string> *cv = fCanvasWidget.getDrawCommands();
chudy@google.com7dcae672012-07-09 20:26:53 +0000533 /* fDebugCanvas is reinitialized every load picture. Need it to retain value
534 * of the visibility filter. */
chudy@google.comc432f002012-07-10 13:19:25 +0000535 fCanvasWidget.toggleCurrentCommandFilter(
536 fSettingsWidget.getVisibilityButton()->isChecked());
chudy@google.com902ebe52012-06-29 14:21:22 +0000537 setupListWidget(cv);
538 setupComboBox(cv);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000539 fInspectorWidget.setDisabled(false);
chudy@google.come606d6e2012-07-12 14:31:25 +0000540 fSettingsWidget.setDisabled(false);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000541 fMenuBar.setDisabled(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000542}
543
544void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000545 fListWidget.clear();
chudy@google.com902ebe52012-06-29 14:21:22 +0000546 int counter = 0;
547 for (unsigned int i = 0; i < cv->size(); i++) {
548 QListWidgetItem *item = new QListWidgetItem();
549 item->setData(Qt::DisplayRole, (*cv)[i].c_str());
550 item->setData(Qt::UserRole + 1, counter++);
chudy@google.comc432f002012-07-10 13:19:25 +0000551 fListWidget.addItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000552 }
553}
554
555void SkDebuggerGUI::setupComboBox(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000556 fFilter.clear();
557 fFilter.addItem("--Filter By Available Commands--");
chudy@google.com902ebe52012-06-29 14:21:22 +0000558
559 std::map<std::string, int> map;
560 for (unsigned int i = 0; i < cv->size(); i++) {
561 map[(*cv)[i]]++;
562 }
563
564 QString overview;
565 int counter;
chudy@google.com7dcae672012-07-09 20:26:53 +0000566 for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
567 ++it) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000568 overview.append((it->first).c_str());
569 overview.append(": ");
570 overview.append(QString::number(it->second));
571 overview.append("<br/>");
chudy@google.com7dcae672012-07-09 20:26:53 +0000572 counter += it->second;
chudy@google.comc432f002012-07-10 13:19:25 +0000573 fFilter.addItem((it->first).c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000574 }
575 QString total;
576 total.append("Total Draw Commands: ");
577 total.append(QString::number(counter));
578 total.append("<br/>");
579 overview.insert(0, total);
580
581 overview.append("<br/>");
582 overview.append("SkBitmap Width: ");
583 // NOTE(chudy): This is where we can pull out the SkPictures width.
chudy@google.comc432f002012-07-10 13:19:25 +0000584 overview.append(QString::number(fCanvasWidget.getBitmapWidth()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000585 overview.append("px<br/>");
586 overview.append("SkBitmap Height: ");
chudy@google.comc432f002012-07-10 13:19:25 +0000587 overview.append(QString::number(fCanvasWidget.getBitmapHeight()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000588 overview.append("px");
chudy@google.comc432f002012-07-10 13:19:25 +0000589 fInspectorWidget.setOverviewText(overview);
chudy@google.com902ebe52012-06-29 14:21:22 +0000590
591 // NOTE(chudy): Makes first item unselectable.
chudy@google.com7dcae672012-07-09 20:26:53 +0000592 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
chudy@google.comc432f002012-07-10 13:19:25 +0000593 fFilter.model());
594 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
595 fFilter.rootModelIndex());
chudy@google.com902ebe52012-06-29 14:21:22 +0000596 QStandardItem* firstItem = model->itemFromIndex(firstIndex);
597 firstItem->setSelectable(false);
598}