OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkDebuggerGUI.h" | 8 #include "SkDebuggerGUI.h" |
9 #include "SkPicture.h" | 9 #include "SkPicture.h" |
10 #include <QListWidgetItem> | 10 #include <QListWidgetItem> |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 , fMenuView(this) | 49 , fMenuView(this) |
50 , fLoading(false) | 50 , fLoading(false) |
51 { | 51 { |
52 setupUi(this); | 52 setupUi(this); |
53 fListWidget.setSelectionMode(QAbstractItemView::ExtendedSelection); | 53 fListWidget.setSelectionMode(QAbstractItemView::ExtendedSelection); |
54 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidge
tItem*)), this, | 54 connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidge
tItem*)), this, |
55 SLOT(updateDrawCommandInfo())); | 55 SLOT(updateDrawCommandInfo())); |
56 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile())); | 56 connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile())); |
57 connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()
)); | 57 connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()
)); |
58 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QList
WidgetItem*)), this, SLOT(loadFile(QListWidgetItem *))); | 58 connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QList
WidgetItem*)), this, SLOT(loadFile(QListWidgetItem *))); |
| 59 connect(&fDirectoryWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(po
pulateDirectoryWidget())); |
59 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete())); | 60 connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete())); |
60 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLO
T(toggleBreakpoint())); | 61 connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLO
T(toggleBreakpoint())); |
61 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind())); | 62 connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind())); |
62 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay())); | 63 connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay())); |
63 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()))
; | 64 connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()))
; |
64 connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForwa
rd())); | 65 connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForwa
rd())); |
65 connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoint
s())); | 66 connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoint
s())); |
66 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()
)); | 67 connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()
)); |
67 connect(&fActionSettings, SIGNAL(triggered()), this, SLOT(actionSettings()))
; | 68 connect(&fActionSettings, SIGNAL(triggered()), this, SLOT(actionSettings()))
; |
68 connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QStrin
g))); | 69 connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QStrin
g))); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 | 279 |
279 void SkDebuggerGUI::saveToFile(const SkString& filename) { | 280 void SkDebuggerGUI::saveToFile(const SkString& filename) { |
280 SkFILEWStream file(filename.c_str()); | 281 SkFILEWStream file(filename.c_str()); |
281 SkAutoTUnref<SkPicture> copy(fDebugger.copyPicture()); | 282 SkAutoTUnref<SkPicture> copy(fDebugger.copyPicture()); |
282 | 283 |
283 sk_tool_utils::PngPixelSerializer serializer; | 284 sk_tool_utils::PngPixelSerializer serializer; |
284 copy->serialize(&file, &serializer); | 285 copy->serialize(&file, &serializer); |
285 } | 286 } |
286 | 287 |
287 void SkDebuggerGUI::loadFile(QListWidgetItem *item) { | 288 void SkDebuggerGUI::loadFile(QListWidgetItem *item) { |
288 if (fDirectoryWidgetActive) { | 289 if (item == nullptr) { |
289 fFileName = fPath.toAscii().data(); | 290 return; |
290 // don't add a '/' to files in the local directory | 291 } |
291 if (fFileName.size() > 0) { | 292 |
292 fFileName.append("/"); | 293 SkString fileName(fPath.toAscii().data()); |
293 } | 294 // don't add a '/' to files in the local directory |
294 fFileName.append(item->text().toAscii().data()); | 295 if (fileName.size() > 0) { |
| 296 fileName.append("/"); |
| 297 } |
| 298 fileName.append(item->text().toAscii().data()); |
| 299 |
| 300 if (!fileName.equals(fFileName)) { |
| 301 fFileName = fileName; |
295 loadPicture(fFileName); | 302 loadPicture(fFileName); |
296 } | 303 } |
297 } | 304 } |
298 | 305 |
299 void SkDebuggerGUI::openFile() { | 306 void SkDebuggerGUI::openFile() { |
300 QString temp = QFileDialog::getOpenFileName(this, tr("Open File"), "", | 307 QString temp = QFileDialog::getOpenFileName(this, tr("Open File"), "", |
301 tr("Files (*.*)")); | 308 tr("Files (*.*)")); |
302 openFile(temp); | 309 openFile(temp); |
303 } | 310 } |
304 | 311 |
305 void SkDebuggerGUI::openFile(const QString &filename) { | 312 void SkDebuggerGUI::openFile(const QString &filename) { |
306 fDirectoryWidgetActive = false; | |
307 if (!filename.isEmpty()) { | 313 if (!filename.isEmpty()) { |
308 QFileInfo pathInfo(filename); | 314 QFileInfo pathInfo(filename); |
309 loadPicture(SkString(filename.toAscii().data())); | 315 loadPicture(SkString(filename.toAscii().data())); |
310 setupDirectoryWidget(pathInfo.path()); | 316 setupDirectoryWidget(pathInfo.path()); |
311 } | 317 } |
312 fDirectoryWidgetActive = true; | |
313 } | 318 } |
314 | 319 |
315 void SkDebuggerGUI::pauseDrawing(bool isPaused) { | 320 void SkDebuggerGUI::pauseDrawing(bool isPaused) { |
316 fPausedRow = fListWidget.currentRow(); | 321 fPausedRow = fListWidget.currentRow(); |
317 this->updateDrawCommandInfo(); | 322 this->updateDrawCommandInfo(); |
318 } | 323 } |
319 | 324 |
320 void SkDebuggerGUI::updateDrawCommandInfo() { | 325 void SkDebuggerGUI::updateDrawCommandInfo() { |
321 int currentRow = -1; | 326 int currentRow = -1; |
322 if (!fLoading) { | 327 if (!fLoading) { |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 fToolBar.addAction(&fActionPlay); | 578 fToolBar.addAction(&fActionPlay); |
574 fToolBar.addSeparator(); | 579 fToolBar.addSeparator(); |
575 fToolBar.addAction(&fActionInspector); | 580 fToolBar.addAction(&fActionInspector); |
576 fToolBar.addAction(&fActionSettings); | 581 fToolBar.addAction(&fActionSettings); |
577 | 582 |
578 fToolBar.addSeparator(); | 583 fToolBar.addSeparator(); |
579 fToolBar.addWidget(&fSpacer); | 584 fToolBar.addWidget(&fSpacer); |
580 fToolBar.addWidget(&fFilter); | 585 fToolBar.addWidget(&fFilter); |
581 fToolBar.addAction(&fActionCancel); | 586 fToolBar.addAction(&fActionCancel); |
582 | 587 |
583 // TODO(chudy): Remove static call. | |
584 fDirectoryWidgetActive = false; | |
585 fFileName = ""; | 588 fFileName = ""; |
586 setupDirectoryWidget(""); | 589 setupDirectoryWidget(""); |
587 fDirectoryWidgetActive = true; | |
588 | 590 |
589 // Menu Bar | 591 // Menu Bar |
590 fMenuFile.setTitle("File"); | 592 fMenuFile.setTitle("File"); |
591 fMenuFile.addAction(&fActionOpen); | 593 fMenuFile.addAction(&fActionOpen); |
592 fMenuFile.addAction(&fActionSave); | 594 fMenuFile.addAction(&fActionSave); |
593 fMenuFile.addAction(&fActionSaveAs); | 595 fMenuFile.addAction(&fActionSaveAs); |
594 fMenuFile.addAction(&fActionClose); | 596 fMenuFile.addAction(&fActionClose); |
595 | 597 |
596 fMenuEdit.setTitle("Edit"); | 598 fMenuEdit.setTitle("Edit"); |
597 fMenuEdit.addAction(&fActionDelete); | 599 fMenuEdit.addAction(&fActionDelete); |
(...skipping 28 matching lines...) Expand all Loading... |
626 fMenuBar.addAction(fMenuView.menuAction()); | 628 fMenuBar.addAction(fMenuView.menuAction()); |
627 fMenuBar.addAction(fMenuNavigate.menuAction()); | 629 fMenuBar.addAction(fMenuNavigate.menuAction()); |
628 fMenuBar.addAction(fMenuWindows.menuAction()); | 630 fMenuBar.addAction(fMenuWindows.menuAction()); |
629 | 631 |
630 SkDebuggerGUI->setMenuBar(&fMenuBar); | 632 SkDebuggerGUI->setMenuBar(&fMenuBar); |
631 QMetaObject::connectSlotsByName(SkDebuggerGUI); | 633 QMetaObject::connectSlotsByName(SkDebuggerGUI); |
632 } | 634 } |
633 | 635 |
634 void SkDebuggerGUI::setupDirectoryWidget(const QString& path) { | 636 void SkDebuggerGUI::setupDirectoryWidget(const QString& path) { |
635 fPath = path; | 637 fPath = path; |
636 QDir dir(path); | 638 populateDirectoryWidget(); |
637 QRegExp r(".skp"); | 639 |
638 fDirectoryWidget.clear(); | 640 // clear the existing watched directory and setup a new directory to watch |
639 const QStringList files = dir.entryList(); | 641 if (!fDirectoryWatcher.directories().empty()) { |
640 foreach (QString f, files) { | 642 fDirectoryWatcher.removePaths(fDirectoryWatcher.directories()); |
641 if (f.contains(r)) | 643 } |
642 fDirectoryWidget.addItem(f); | 644 if (!path.isEmpty()) { |
| 645 fDirectoryWatcher.addPath(fPath); |
643 } | 646 } |
644 } | 647 } |
645 | 648 |
| 649 void SkDebuggerGUI::populateDirectoryWidget() { |
| 650 QDir dir(fPath); |
| 651 QRegExp r(".skp"); |
| 652 const QStringList files = dir.entryList(); |
| 653 |
| 654 // check if a file has been removed |
| 655 for (int i = fDirectoryWidget.count() - 1; i >= 0; i--) { |
| 656 QListWidgetItem* item = fDirectoryWidget.item(i); |
| 657 if (!files.contains(item->text())) { |
| 658 fDirectoryWidget.removeItemWidget(item); |
| 659 delete item; |
| 660 } |
| 661 } |
| 662 |
| 663 // add any new files |
| 664 foreach (QString f, files) { |
| 665 if (f.contains(r) && fDirectoryWidget.findItems(f, Qt::MatchExactly).siz
e() == 0) { |
| 666 fDirectoryWidget.addItem(f); |
| 667 } |
| 668 } |
| 669 } |
| 670 |
646 void SkDebuggerGUI::loadPicture(const SkString& fileName) { | 671 void SkDebuggerGUI::loadPicture(const SkString& fileName) { |
647 fFileName = fileName; | 672 fFileName = fileName; |
648 fLoading = true; | 673 fLoading = true; |
649 SkAutoTDelete<SkStream> stream(new SkFILEStream(fileName.c_str())); | 674 SkAutoTDelete<SkStream> stream(new SkFILEStream(fileName.c_str())); |
650 | 675 |
651 SkPicture* picture = SkPicture::CreateFromStream(stream); | 676 SkPicture* picture = SkPicture::CreateFromStream(stream); |
652 | 677 |
653 if (nullptr == picture) { | 678 if (nullptr == picture) { |
654 QMessageBox::critical(this, "Error loading file", "Couldn't read file, s
orry."); | 679 QMessageBox::critical(this, "Error loading file", "Couldn't read file, s
orry."); |
655 return; | 680 return; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 fCanvasWidget.drawTo(fPausedRow); | 794 fCanvasWidget.drawTo(fPausedRow); |
770 } else { | 795 } else { |
771 fCanvasWidget.drawTo(fListWidget.currentRow()); | 796 fCanvasWidget.drawTo(fListWidget.currentRow()); |
772 } | 797 } |
773 } | 798 } |
774 | 799 |
775 void SkDebuggerGUI::updateHit(int newHit) { | 800 void SkDebuggerGUI::updateHit(int newHit) { |
776 fCommandHitBox.setText(QString::number(newHit)); | 801 fCommandHitBox.setText(QString::number(newHit)); |
777 } | 802 } |
778 | 803 |
OLD | NEW |