blob: 823fffc54e4e6f6449ea65cb24b6965a7c5e4ca6 [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)
chudy@google.coma1226312012-07-26 20:26:44 +000031 , fActionZoomIn(this)
32 , fActionZoomOut(this)
33 , fMapper(this)
chudy@google.comc432f002012-07-10 13:19:25 +000034 , fCentralWidget(this)
35 , fFilter(&fCentralWidget)
36 , fContainerLayout(&fCentralWidget)
37 , fListWidget(&fCentralWidget)
38 , fDirectoryWidget(&fCentralWidget)
39 , fCanvasWidget(&fCentralWidget)
40 , fSettingsWidget(&fCentralWidget)
41 , fStatusBar(this)
42 , fMenuBar(this)
43 , fMenuFile(this)
44 , fMenuNavigate(this)
45 , fMenuView(this)
46 , fToolBar(this)
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000047 , fBreakpointsActivated(false)
48 , fDeletesActivated(false)
49 , fPause(false)
chudy@google.comd3058f52012-07-19 13:41:27 +000050 , fLoading(false)
chudy@google.comc432f002012-07-10 13:19:25 +000051{
chudy@google.com902ebe52012-06-29 14:21:22 +000052 setupUi(this);
chudy@google.comea5488b2012-07-26 19:38:22 +000053 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000054 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
chudy@google.comea5488b2012-07-26 19:38:22 +000055 connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()));
56 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *)));
chudy@google.comc432f002012-07-10 13:19:25 +000057 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
chudy@google.comea5488b2012-07-26 19:38:22 +000058 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint()));
chudy@google.comc432f002012-07-10 13:19:25 +000059 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
60 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
61 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
chudy@google.comea5488b2012-07-26 19:38:22 +000062 connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward()));
63 connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints()));
64 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()));
65 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionSettings()));
66 connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString)));
chudy@google.comc432f002012-07-10 13:19:25 +000067 connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000068 connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
69 connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
chudy@google.comc432f002012-07-10 13:19:25 +000070 connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
chudy@google.comea5488b2012-07-26 19:38:22 +000071 connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this, SLOT(actionCommandFilter()));
72 connect(fSettingsWidget.getGLCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionGLWidget(bool)));
73 connect(fSettingsWidget.getRasterCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionRasterWidget(bool)));
74 connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool)));
chudy@google.come504de02012-07-16 18:35:23 +000075 connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000076 connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
chudy@google.comea5488b2012-07-26 19:38:22 +000077 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
78 connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int)));
79 connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float)));
80 connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int)));
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000081
chudy@google.coma1226312012-07-26 20:26:44 +000082 fMapper.setMapping(&fActionZoomIn, 1);
83 fMapper.setMapping(&fActionZoomOut, -1);
84
85 connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map()));
86 connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map()));
87 connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(keyZoom(int)));
88
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000089 fInspectorWidget.setDisabled(true);
chudy@google.comd3058f52012-07-19 13:41:27 +000090 fMenuEdit.setDisabled(true);
91 fMenuNavigate.setDisabled(true);
92 fMenuView.setDisabled(true);
93
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
chudy@google.comea5488b2012-07-26 19:38:22 +0000173void SkDebuggerGUI::actionGLWidget(bool isToggled) {
174 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled);
175}
176
chudy@google.com902ebe52012-06-29 14:21:22 +0000177void SkDebuggerGUI::actionInspector() {
chudy@google.comc432f002012-07-10 13:19:25 +0000178 if (fInspectorWidget.isHidden()) {
179 fInspectorWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000180 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000181 fInspectorWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000182 }
183}
184
185void SkDebuggerGUI::actionPlay() {
chudy@google.comc432f002012-07-10 13:19:25 +0000186 for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
chudy@google.com7dcae672012-07-09 20:26:53 +0000187 row++) {
chudy@google.comc432f002012-07-10 13:19:25 +0000188 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000189 if (item->checkState() == Qt::Checked) {
chudy@google.comc432f002012-07-10 13:19:25 +0000190 fListWidget.setCurrentItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000191 return;
192 }
193 }
chudy@google.comc432f002012-07-10 13:19:25 +0000194 fListWidget.setCurrentRow(fListWidget.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000195}
196
chudy@google.comea5488b2012-07-26 19:38:22 +0000197void SkDebuggerGUI::actionRasterWidget(bool isToggled) {
198 fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, !isToggled);
199}
200
chudy@google.com902ebe52012-06-29 14:21:22 +0000201void SkDebuggerGUI::actionRewind() {
chudy@google.come504de02012-07-16 18:35:23 +0000202 fListWidget.setCurrentRow(0);
chudy@google.com902ebe52012-06-29 14:21:22 +0000203}
204
chudy@google.com7dcae672012-07-09 20:26:53 +0000205void SkDebuggerGUI::actionScale(float scaleFactor) {
chudy@google.comc432f002012-07-10 13:19:25 +0000206 fSettingsWidget.setZoomText(scaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000207}
208
chudy@google.com902ebe52012-06-29 14:21:22 +0000209void SkDebuggerGUI::actionSettings() {
chudy@google.comc432f002012-07-10 13:19:25 +0000210 if (fSettingsWidget.isHidden()) {
211 fSettingsWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000212 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000213 fSettingsWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000214 }
215}
216
217void SkDebuggerGUI::actionStepBack() {
chudy@google.comc432f002012-07-10 13:19:25 +0000218 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000219 if (currentRow != 0) {
chudy@google.comc432f002012-07-10 13:19:25 +0000220 fListWidget.setCurrentRow(currentRow - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000221 }
222}
223
224void SkDebuggerGUI::actionStepForward() {
chudy@google.comc432f002012-07-10 13:19:25 +0000225 int currentRow = fListWidget.currentRow();
chudy@google.com902ebe52012-06-29 14:21:22 +0000226 QString curRow = QString::number(currentRow);
chudy@google.comc432f002012-07-10 13:19:25 +0000227 QString curCount = QString::number(fListWidget.count());
228 if (currentRow < fListWidget.count() - 1) {
229 fListWidget.setCurrentRow(currentRow + 1);
chudy@google.com902ebe52012-06-29 14:21:22 +0000230 }
231}
232
233void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
234 if (fDirectoryWidgetActive) {
235 QString fileName;
236 fileName.append(fPath);
237 fileName.append("/");
238 fileName.append(item->text());
239 loadPicture(fileName);
240 }
241}
242
243void SkDebuggerGUI::openFile() {
chudy@google.com7dcae672012-07-09 20:26:53 +0000244 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
245 tr("Files (*.*)"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000246 fDirectoryWidgetActive = false;
247 if (!fileName.isNull()) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000248 QFileInfo pathInfo(fileName);
249 fPath = pathInfo.path();
250 loadPicture(fileName);
251 setupDirectoryWidget();
252 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000253 fDirectoryWidgetActive = true;
254}
255
chudy@google.comc432f002012-07-10 13:19:25 +0000256void SkDebuggerGUI::pauseDrawing(bool isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000257 // Qt uses 0 for unchecked, 1 for partially enabled and 2 for checked.
chudy@google.comc432f002012-07-10 13:19:25 +0000258 if (isPaused) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000259 fPause = true;
chudy@google.com233e4b82012-07-12 14:38:49 +0000260 fPausedRow = fListWidget.currentRow();
chudy@google.com7dcae672012-07-09 20:26:53 +0000261 } else {
262 fPause = false;
chudy@google.comc432f002012-07-10 13:19:25 +0000263 fCanvasWidget.drawTo(fListWidget.currentRow());
chudy@google.com7dcae672012-07-09 20:26:53 +0000264 }
265}
266
chudy@google.com902ebe52012-06-29 14:21:22 +0000267void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000268 if(!fLoading) {
269 int currentRow = fListWidget.currentRow();
chudy@google.comd3058f52012-07-19 13:41:27 +0000270
chudy@google.comea5488b2012-07-26 19:38:22 +0000271 if (currentRow != -1) {
272 if (!fPause) {
273 fCanvasWidget.drawTo(currentRow);
chudy@google.comd3058f52012-07-19 13:41:27 +0000274 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000275 std::vector<std::string> *cuffInfo = fCanvasWidget.getCurrentCommandInfo(
276 currentRow);
277
278 /* TODO(chudy): Add command type before parameters. Rename v
279 * to something more informative. */
280 if (cuffInfo) {
281 std::vector<std::string>::iterator it;
282
283 QString info;
284 info.append("<b>Parameters: </b><br/>");
285 for (it = cuffInfo->begin(); it != cuffInfo->end(); ++it) {
286 info.append(QString((*it).c_str()));
287 info.append("<br/>");
288 }
289 fInspectorWidget.setDetailText(info);
290 fInspectorWidget.setDisabled(false);
291 fInspectorWidget.setMatrix(fCanvasWidget.getCurrentMatrix());
292 fInspectorWidget.setClip(fCanvasWidget.getCurrentClip());
293 }
chudy@google.comd3058f52012-07-19 13:41:27 +0000294 }
chudy@google.comea5488b2012-07-26 19:38:22 +0000295
chudy@google.com902ebe52012-06-29 14:21:22 +0000296 }
297}
298
chudy@google.com9ca9bfe2012-07-12 21:58:14 +0000299void SkDebuggerGUI::selectCommand(int command) {
300 if (fPause) {
301 fListWidget.setCurrentRow(command);
302 }
303}
304
chudy@google.com902ebe52012-06-29 14:21:22 +0000305void SkDebuggerGUI::toggleBreakpoint() {
chudy@google.comc432f002012-07-10 13:19:25 +0000306 QListWidgetItem* item = fListWidget.currentItem();
chudy@google.com902ebe52012-06-29 14:21:22 +0000307 if (item->checkState() == Qt::Unchecked) {
308 item->setCheckState(Qt::Checked);
chudy@google.come565de42012-07-12 14:15:54 +0000309 item->setData(Qt::DecorationRole,
310 QPixmap(":/images/Icons/breakpoint_16x16.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000311 } else {
chudy@google.com902ebe52012-06-29 14:21:22 +0000312 item->setCheckState(Qt::Unchecked);
chudy@google.come565de42012-07-12 14:15:54 +0000313 item->setData(Qt::DecorationRole,
314 QPixmap(":/images/Icons/blank.png"));
chudy@google.com902ebe52012-06-29 14:21:22 +0000315 }
316}
317
318void SkDebuggerGUI::toggleDirectory() {
chudy@google.comc432f002012-07-10 13:19:25 +0000319 if (fDirectoryWidget.isHidden()) {
320 fDirectoryWidget.setHidden(false);
chudy@google.com902ebe52012-06-29 14:21:22 +0000321 } else {
chudy@google.comc432f002012-07-10 13:19:25 +0000322 fDirectoryWidget.setHidden(true);
chudy@google.com902ebe52012-06-29 14:21:22 +0000323 }
324}
325
326void SkDebuggerGUI::toggleFilter(QString string) {
chudy@google.comc432f002012-07-10 13:19:25 +0000327 for (int row = 0; row < fListWidget.count(); row++) {
328 QListWidgetItem *item = fListWidget.item(row);
chudy@google.com902ebe52012-06-29 14:21:22 +0000329 if (item->text() == string) {
330 item->setHidden(false);
331 } else {
332 item->setHidden(true);
333 }
334 }
335}
336
337void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
338 QIcon windowIcon;
chudy@google.com7dcae672012-07-09 20:26:53 +0000339 windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(),
340 QIcon::Normal, QIcon::Off);
chudy@google.com902ebe52012-06-29 14:21:22 +0000341 SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
342 SkDebuggerGUI->resize(1200, 1000);
343 SkDebuggerGUI->setWindowIcon(windowIcon);
chudy@google.comc432f002012-07-10 13:19:25 +0000344 SkDebuggerGUI->setWindowTitle("Skia Debugger");
chudy@google.com902ebe52012-06-29 14:21:22 +0000345
chudy@google.come504de02012-07-16 18:35:23 +0000346 fActionOpen.setShortcuts(QKeySequence::Open);
chudy@google.comc432f002012-07-10 13:19:25 +0000347 fActionOpen.setText("Open");
chudy@google.com902ebe52012-06-29 14:21:22 +0000348
349 QIcon breakpoint;
chudy@google.com7dcae672012-07-09 20:26:53 +0000350 breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"),
351 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000352 fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
chudy@google.comc432f002012-07-10 13:19:25 +0000353 fActionBreakpoint.setIcon(breakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000354 fActionBreakpoint.setText("Breakpoints");
chudy@google.com902ebe52012-06-29 14:21:22 +0000355
356 QIcon cancel;
chudy@google.come504de02012-07-16 18:35:23 +0000357 cancel.addFile(QString::fromUtf8(":/images/Ico/reload.png"), QSize(),
chudy@google.com7dcae672012-07-09 20:26:53 +0000358 QIcon::Normal, QIcon::Off);
chudy@google.comc432f002012-07-10 13:19:25 +0000359 fActionCancel.setIcon(cancel);
360 fActionCancel.setText("Clear Filter");
chudy@google.com902ebe52012-06-29 14:21:22 +0000361
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000362 fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
363 fActionClearBreakpoints.setText("Clear Breakpoints");
364
365 fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
366 fActionClearDeletes.setText("Clear Deletes");
367
chudy@google.come504de02012-07-16 18:35:23 +0000368 fActionClose.setShortcuts(QKeySequence::Quit);
chudy@google.comc432f002012-07-10 13:19:25 +0000369 fActionClose.setText("Exit");
chudy@google.com902ebe52012-06-29 14:21:22 +0000370
chudy@google.come504de02012-07-16 18:35:23 +0000371 fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
372 fActionCreateBreakpoint.setText("Set Breakpoint");
373
374 fActionDelete.setShortcut(QKeySequence(tr("X")));
chudy@google.comc432f002012-07-10 13:19:25 +0000375 fActionDelete.setText("Delete Command");
chudy@google.com902ebe52012-06-29 14:21:22 +0000376
chudy@google.come504de02012-07-16 18:35:23 +0000377 fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
378 fActionDirectory.setText("Directory");
chudy@google.com902ebe52012-06-29 14:21:22 +0000379
chudy@google.comc432f002012-07-10 13:19:25 +0000380 QIcon inspector;
chudy@google.come504de02012-07-16 18:35:23 +0000381 inspector.addFile(QString::fromUtf8(":/images/Ico/inspector.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000382 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000383 fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
chudy@google.comc432f002012-07-10 13:19:25 +0000384 fActionInspector.setIcon(inspector);
chudy@google.come504de02012-07-16 18:35:23 +0000385 fActionInspector.setText("Inspector");
chudy@google.com902ebe52012-06-29 14:21:22 +0000386
chudy@google.comc432f002012-07-10 13:19:25 +0000387 QIcon play;
chudy@google.come504de02012-07-16 18:35:23 +0000388 play.addFile(QString::fromUtf8(":/images/Ico/play.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000389 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000390 fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
chudy@google.comc432f002012-07-10 13:19:25 +0000391 fActionPlay.setIcon(play);
392 fActionPlay.setText("Play");
chudy@google.com902ebe52012-06-29 14:21:22 +0000393
chudy@google.come504de02012-07-16 18:35:23 +0000394 QIcon pause;
395 pause.addFile(QString::fromUtf8(":/images/Ico/pause.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000396 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000397 fActionPause.setShortcut(QKeySequence(tr("Space")));
398 fActionPause.setCheckable(true);
399 fActionPause.setIcon(pause);
400 fActionPause.setText("Pause");
401
chudy@google.comc432f002012-07-10 13:19:25 +0000402 QIcon rewind;
chudy@google.come504de02012-07-16 18:35:23 +0000403 rewind.addFile(QString::fromUtf8(":/images/Ico/rewind.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000404 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000405 fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
chudy@google.comc432f002012-07-10 13:19:25 +0000406 fActionRewind.setIcon(rewind);
407 fActionRewind.setText("Rewind");
chudy@google.com902ebe52012-06-29 14:21:22 +0000408
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000409 fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
410 fActionShowDeletes.setText("Deleted Commands");
411
chudy@google.comc432f002012-07-10 13:19:25 +0000412 QIcon stepBack;
chudy@google.come504de02012-07-16 18:35:23 +0000413 stepBack.addFile(QString::fromUtf8(":/images/Ico/previous.png"), QSize(),
chudy@google.comc432f002012-07-10 13:19:25 +0000414 QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000415 fActionStepBack.setShortcut(QKeySequence(tr("[")));
chudy@google.comc432f002012-07-10 13:19:25 +0000416 fActionStepBack.setIcon(stepBack);
417 fActionStepBack.setText("Step Back");
chudy@google.com902ebe52012-06-29 14:21:22 +0000418
chudy@google.comc432f002012-07-10 13:19:25 +0000419 QIcon stepForward;
chudy@google.come504de02012-07-16 18:35:23 +0000420 stepForward.addFile(QString::fromUtf8(":/images/Ico/next.png"),
chudy@google.comc432f002012-07-10 13:19:25 +0000421 QSize(), QIcon::Normal, QIcon::Off);
chudy@google.come504de02012-07-16 18:35:23 +0000422 fActionStepForward.setShortcut(QKeySequence(tr("]")));
chudy@google.comc432f002012-07-10 13:19:25 +0000423 fActionStepForward.setIcon(stepForward);
424 fActionStepForward.setText("Step Forward");
425
chudy@google.coma1226312012-07-26 20:26:44 +0000426 fActionZoomIn.setShortcut(QKeySequence(tr("Ctrl+=")));
427 fActionZoomIn.setText("Zoom In");
428 fActionZoomOut.setShortcut(QKeySequence(tr("Ctrl+-")));
429 fActionZoomOut.setText("Zoom Out");
430
chudy@google.comc432f002012-07-10 13:19:25 +0000431 fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
432 fListWidget.setObjectName(QString::fromUtf8("listWidget"));
433 fListWidget.setMaximumWidth(250);
434
435 fFilter.addItem("--Filter By Available Commands--");
436
437 fDirectoryWidget.setMaximumWidth(250);
438 fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
439
440 fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000441 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +0000442
chudy@google.comc432f002012-07-10 13:19:25 +0000443 fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
chudy@google.com7dcae672012-07-09 20:26:53 +0000444 QSizePolicy::Expanding);
chudy@google.comc432f002012-07-10 13:19:25 +0000445 fInspectorWidget.setMaximumHeight(300);
chudy@google.com902ebe52012-06-29 14:21:22 +0000446
chudy@google.comc432f002012-07-10 13:19:25 +0000447 fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
448 QSizePolicy::Expanding);
449 fSettingsWidget.setMaximumWidth(250);
chudy@google.com902ebe52012-06-29 14:21:22 +0000450
chudy@google.comc432f002012-07-10 13:19:25 +0000451 fLeftColumnLayout.setSpacing(6);
452 fLeftColumnLayout.addWidget(&fListWidget);
453 fLeftColumnLayout.addWidget(&fDirectoryWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000454
chudy@google.comc432f002012-07-10 13:19:25 +0000455 fCanvasAndSettingsLayout.setSpacing(6);
456 fCanvasAndSettingsLayout.addWidget(&fCanvasWidget);
457 fCanvasAndSettingsLayout.addWidget(&fSettingsWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000458
chudy@google.comc432f002012-07-10 13:19:25 +0000459 fMainAndRightColumnLayout.setSpacing(6);
460 fMainAndRightColumnLayout.addLayout(&fCanvasAndSettingsLayout);
461 fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
chudy@google.com902ebe52012-06-29 14:21:22 +0000462
chudy@google.comc432f002012-07-10 13:19:25 +0000463 fContainerLayout.setSpacing(6);
464 fContainerLayout.setContentsMargins(11, 11, 11, 11);
465 fContainerLayout.addLayout(&fLeftColumnLayout);
466 fContainerLayout.addLayout(&fMainAndRightColumnLayout);
467
468 SkDebuggerGUI->setCentralWidget(&fCentralWidget);
469 SkDebuggerGUI->setStatusBar(&fStatusBar);
470
chudy@google.come504de02012-07-16 18:35:23 +0000471 fToolBar.setIconSize(QSize(32, 32));
chudy@google.comc432f002012-07-10 13:19:25 +0000472 fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
473 SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000474
475 QWidget *spacer = new QWidget();
476 spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
477
chudy@google.comc432f002012-07-10 13:19:25 +0000478 fToolBar.addAction(&fActionRewind);
479 fToolBar.addAction(&fActionStepBack);
chudy@google.come504de02012-07-16 18:35:23 +0000480 fToolBar.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000481 fToolBar.addAction(&fActionStepForward);
482 fToolBar.addAction(&fActionPlay);
483 fToolBar.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000484 fToolBar.addAction(&fActionInspector);
chudy@google.comc432f002012-07-10 13:19:25 +0000485 fToolBar.addSeparator();
chudy@google.comc432f002012-07-10 13:19:25 +0000486 fToolBar.addWidget(spacer);
487 fToolBar.addWidget(&fFilter);
488 fToolBar.addAction(&fActionCancel);
chudy@google.com902ebe52012-06-29 14:21:22 +0000489
490 // TODO(chudy): Remove static call.
491 fDirectoryWidgetActive = false;
chudy@google.comea5488b2012-07-26 19:38:22 +0000492 fPath = "/usr/local/google/home/chudy/trunk-git/trunk/skp";
chudy@google.com902ebe52012-06-29 14:21:22 +0000493 setupDirectoryWidget();
494 fDirectoryWidgetActive = true;
495
chudy@google.com902ebe52012-06-29 14:21:22 +0000496 // Menu Bar
chudy@google.comc432f002012-07-10 13:19:25 +0000497 fMenuFile.setTitle("File");
498 fMenuFile.addAction(&fActionOpen);
499 fMenuFile.addAction(&fActionClose);
chudy@google.come504de02012-07-16 18:35:23 +0000500
501 fMenuEdit.setTitle("Edit");
502 fMenuEdit.addAction(&fActionDelete);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000503 fMenuEdit.addAction(&fActionClearDeletes);
504 fMenuEdit.addSeparator();
chudy@google.come504de02012-07-16 18:35:23 +0000505 fMenuEdit.addAction(&fActionCreateBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000506 fMenuEdit.addAction(&fActionClearBreakpoints);
chudy@google.come504de02012-07-16 18:35:23 +0000507
chudy@google.comc432f002012-07-10 13:19:25 +0000508 fMenuNavigate.setTitle("Navigate");
chudy@google.come504de02012-07-16 18:35:23 +0000509 fMenuNavigate.addAction(&fActionRewind);
510 fMenuNavigate.addAction(&fActionStepBack);
511 fMenuNavigate.addAction(&fActionStepForward);
512 fMenuNavigate.addAction(&fActionPlay);
513 fMenuNavigate.addAction(&fActionPause);
chudy@google.comc432f002012-07-10 13:19:25 +0000514 fMenuNavigate.addAction(&fActionGoToLine);
chudy@google.come504de02012-07-16 18:35:23 +0000515
chudy@google.comc432f002012-07-10 13:19:25 +0000516 fMenuView.setTitle("View");
chudy@google.come504de02012-07-16 18:35:23 +0000517 fMenuView.addAction(&fActionBreakpoint);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000518 fMenuView.addAction(&fActionShowDeletes);
chudy@google.coma1226312012-07-26 20:26:44 +0000519 fMenuView.addAction(&fActionZoomIn);
520 fMenuView.addAction(&fActionZoomOut);
chudy@google.come504de02012-07-16 18:35:23 +0000521
522 fMenuWindows.setTitle("Window");
523 fMenuWindows.addAction(&fActionInspector);
524 fMenuWindows.addAction(&fActionDirectory);
chudy@google.comc432f002012-07-10 13:19:25 +0000525
526 fActionGoToLine.setText("Go to Line...");
527 fActionGoToLine.setDisabled(true);
528 fMenuBar.addAction(fMenuFile.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000529 fMenuBar.addAction(fMenuEdit.menuAction());
chudy@google.comc432f002012-07-10 13:19:25 +0000530 fMenuBar.addAction(fMenuView.menuAction());
531 fMenuBar.addAction(fMenuNavigate.menuAction());
chudy@google.come504de02012-07-16 18:35:23 +0000532 fMenuBar.addAction(fMenuWindows.menuAction());
chudy@google.com902ebe52012-06-29 14:21:22 +0000533
chudy@google.com7dcae672012-07-09 20:26:53 +0000534 fPause = false;
535
chudy@google.comc432f002012-07-10 13:19:25 +0000536 SkDebuggerGUI->setMenuBar(&fMenuBar);
chudy@google.com902ebe52012-06-29 14:21:22 +0000537 QMetaObject::connectSlotsByName(SkDebuggerGUI);
538}
539
540void SkDebuggerGUI::setupDirectoryWidget() {
chudy@google.comc432f002012-07-10 13:19:25 +0000541 QDir dir(fPath);
chudy@google.com902ebe52012-06-29 14:21:22 +0000542 QRegExp r(".skp");
chudy@google.comc432f002012-07-10 13:19:25 +0000543 fDirectoryWidget.clear();
544 const QStringList files = dir.entryList();
chudy@google.com902ebe52012-06-29 14:21:22 +0000545 foreach (QString f, files) {
chudy@google.com7dcae672012-07-09 20:26:53 +0000546 if (f.contains(r))
chudy@google.comc432f002012-07-10 13:19:25 +0000547 fDirectoryWidget.addItem(f);
chudy@google.com902ebe52012-06-29 14:21:22 +0000548 }
549}
550
chudy@google.com902ebe52012-06-29 14:21:22 +0000551void SkDebuggerGUI::loadPicture(QString fileName) {
chudy@google.comd3058f52012-07-19 13:41:27 +0000552 fLoading = true;
chudy@google.comc432f002012-07-10 13:19:25 +0000553 fCanvasWidget.loadPicture(fileName);
554 std::vector<std::string> *cv = fCanvasWidget.getDrawCommands();
chudy@google.com7dcae672012-07-09 20:26:53 +0000555 /* fDebugCanvas is reinitialized every load picture. Need it to retain value
556 * of the visibility filter. */
chudy@google.comc432f002012-07-10 13:19:25 +0000557 fCanvasWidget.toggleCurrentCommandFilter(
558 fSettingsWidget.getVisibilityButton()->isChecked());
chudy@google.com902ebe52012-06-29 14:21:22 +0000559 setupListWidget(cv);
560 setupComboBox(cv);
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000561 fInspectorWidget.setDisabled(false);
chudy@google.come606d6e2012-07-12 14:31:25 +0000562 fSettingsWidget.setDisabled(false);
chudy@google.comd3058f52012-07-19 13:41:27 +0000563 fMenuEdit.setDisabled(false);
564 fMenuNavigate.setDisabled(false);
565 fMenuView.setDisabled(false);
566 fLoading = false;
567 actionPlay();
chudy@google.com902ebe52012-06-29 14:21:22 +0000568}
569
570void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000571 fListWidget.clear();
chudy@google.com902ebe52012-06-29 14:21:22 +0000572 int counter = 0;
573 for (unsigned int i = 0; i < cv->size(); i++) {
574 QListWidgetItem *item = new QListWidgetItem();
575 item->setData(Qt::DisplayRole, (*cv)[i].c_str());
576 item->setData(Qt::UserRole + 1, counter++);
chudy@google.comc432f002012-07-10 13:19:25 +0000577 fListWidget.addItem(item);
chudy@google.com902ebe52012-06-29 14:21:22 +0000578 }
579}
580
581void SkDebuggerGUI::setupComboBox(std::vector<std::string>* cv) {
chudy@google.comc432f002012-07-10 13:19:25 +0000582 fFilter.clear();
583 fFilter.addItem("--Filter By Available Commands--");
chudy@google.com902ebe52012-06-29 14:21:22 +0000584
585 std::map<std::string, int> map;
586 for (unsigned int i = 0; i < cv->size(); i++) {
587 map[(*cv)[i]]++;
588 }
589
590 QString overview;
591 int counter;
chudy@google.com7dcae672012-07-09 20:26:53 +0000592 for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
593 ++it) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000594 overview.append((it->first).c_str());
595 overview.append(": ");
596 overview.append(QString::number(it->second));
597 overview.append("<br/>");
chudy@google.com7dcae672012-07-09 20:26:53 +0000598 counter += it->second;
chudy@google.comc432f002012-07-10 13:19:25 +0000599 fFilter.addItem((it->first).c_str());
chudy@google.com902ebe52012-06-29 14:21:22 +0000600 }
601 QString total;
602 total.append("Total Draw Commands: ");
603 total.append(QString::number(counter));
604 total.append("<br/>");
605 overview.insert(0, total);
606
607 overview.append("<br/>");
608 overview.append("SkBitmap Width: ");
609 // NOTE(chudy): This is where we can pull out the SkPictures width.
chudy@google.comc432f002012-07-10 13:19:25 +0000610 overview.append(QString::number(fCanvasWidget.getBitmapWidth()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000611 overview.append("px<br/>");
612 overview.append("SkBitmap Height: ");
chudy@google.comc432f002012-07-10 13:19:25 +0000613 overview.append(QString::number(fCanvasWidget.getBitmapHeight()));
chudy@google.com902ebe52012-06-29 14:21:22 +0000614 overview.append("px");
chudy@google.comc432f002012-07-10 13:19:25 +0000615 fInspectorWidget.setOverviewText(overview);
chudy@google.com902ebe52012-06-29 14:21:22 +0000616
617 // NOTE(chudy): Makes first item unselectable.
chudy@google.com7dcae672012-07-09 20:26:53 +0000618 QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
chudy@google.comc432f002012-07-10 13:19:25 +0000619 fFilter.model());
620 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
621 fFilter.rootModelIndex());
chudy@google.com902ebe52012-06-29 14:21:22 +0000622 QStandardItem* firstItem = model->itemFromIndex(firstIndex);
623 firstItem->setSelectable(false);
624}