1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/* 2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Copyright 2012 Google Inc. 3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * 4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Use of this source code is governed by a BSD-style license that can be 5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * found in the LICENSE file. 6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com */ 7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkDebuggerGUI.h" 93f0424ff57f93666df7347d4787816b210233eb0fmalita#include "SkPicture.h" 10cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include <QListWidgetItem> 11cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include <QtGui> 123e5c2b1041b15641931638d1d78b30d3c435fc71robertphillips#include "sk_tool_utils.h" 13e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com 14902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comSkDebuggerGUI::SkDebuggerGUI(QWidget *parent) : 15c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QMainWindow(parent) 16bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org , fCentralSplitter(this) 172d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com , fStatusBar(this) 182d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com , fToolBar(this) 19c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionOpen(this) 20c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionBreakpoint(this) 21c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionCancel(this) 227e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fActionClearBreakpoints(this) 23e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com , fActionClearDeletes(this) 24c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionClose(this) 25e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com , fActionCreateBreakpoint(this) 26c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionDelete(this) 27c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionDirectory(this) 28c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionGoToLine(this) 29c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionInspector(this) 302ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com , fActionSettings(this) 31c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionPlay(this) 32e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com , fActionPause(this) 33c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionRewind(this) 340ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com , fActionSave(this) 350ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com , fActionSaveAs(this) 367e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fActionShowDeletes(this) 37c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionStepBack(this) 38c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionStepForward(this) 39a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com , fActionZoomIn(this) 40a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com , fActionZoomOut(this) 41a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com , fMapper(this) 42bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org , fListWidget(&fCentralSplitter) 43bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org , fDirectoryWidget(&fCentralSplitter) 44607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com , fCanvasWidget(this, &fDebugger) 4563a470227beed0de553d769724e0108808391e42kkinnunen , fDrawCommandGeometryWidget(&fDebugger) 46c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuBar(this) 47c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuFile(this) 48c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuNavigate(this) 49c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuView(this) 50d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com , fLoading(false) 51c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com{ 52902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com setupUi(this); 53dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fListWidget.setSelectionMode(QAbstractItemView::ExtendedSelection); 540cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, 550cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen SLOT(updateDrawCommandInfo())); 56c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile())); 57ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory())); 58ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *))); 59a745186c939ec641a861c74064155ec4aa3beb33djsollen connect(&fDirectoryWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(populateDirectoryWidget())); 60c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete())); 61ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint())); 62c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind())); 63c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay())); 64c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack())); 65ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward())); 66ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints())); 67ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector())); 682ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com connect(&fActionSettings, SIGNAL(triggered()), this, SLOT(actionSettings())); 69ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString))); 70c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel())); 717e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints())); 727e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes())); 73c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose())); 74e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU 7541c79cc0ff3003ef77cb48590f7887221856f941kkinnunen connect(&fSettingsWidget, SIGNAL(glSettingsChanged()), this, SLOT(actionGLSettingsChanged())); 76e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif 7741c79cc0ff3003ef77cb48590f7887221856f941kkinnunen connect(&fSettingsWidget, SIGNAL(rasterSettingsChanged()), this, SLOT(actionRasterSettingsChanged())); 7841c79cc0ff3003ef77cb48590f7887221856f941kkinnunen connect(&fSettingsWidget, SIGNAL(visualizationsChanged()), this, SLOT(actionVisualizationsChanged())); 7932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com connect(&fSettingsWidget, SIGNAL(texFilterSettingsChanged()), this, SLOT(actionTextureFilter())); 80ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool))); 81e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint())); 827e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes())); 83ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int))); 8441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(updateHit(int))); 85ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float))); 8663a470227beed0de553d769724e0108808391e42kkinnunen 870ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); 880ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave())); 897e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 90e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com fMapper.setMapping(&fActionZoomIn, SkCanvasWidget::kIn_ZoomCommand); 91e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com fMapper.setMapping(&fActionZoomOut, SkCanvasWidget::kOut_ZoomCommand); 92a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com 93a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map())); 94a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map())); 95e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(zoom(int))); 96a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com 9741c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateFrame.setDisabled(true); 987e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fInspectorWidget.setDisabled(true); 99d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuEdit.setDisabled(true); 100d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuNavigate.setDisabled(true); 101d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuView.setDisabled(true); 102bbad34de3b117347bedea619feaf1685586d4202chudy@google.com} 103902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 104902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionBreakpoints() { 105f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen bool breakpointsActivated = fActionBreakpoint.isChecked(); 1067e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 1077e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com QListWidgetItem *item = fListWidget.item(row); 108f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen item->setHidden(item->checkState() == Qt::Unchecked && breakpointsActivated); 109902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 1107e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com} 111902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1127e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::showDeletes() { 113f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen bool deletesActivated = fActionShowDeletes.isChecked(); 114c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 115c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem *item = fListWidget.item(row); 116f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen item->setHidden(fDebugger.isCommandVisible(row) && deletesActivated); 117902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 118902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 119d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 120902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionCancel() { 121c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 122c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.item(row)->setHidden(false); 123902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 124902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 125902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1267e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::actionClearBreakpoints() { 1277e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 1287e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com QListWidgetItem* item = fListWidget.item(row); 1297e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com item->setCheckState(Qt::Unchecked); 1307e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com item->setData(Qt::DecorationRole, 1318e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com QPixmap(":/blank.png")); 1327e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com } 1337e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com} 1347e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 1357e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::actionClearDeletes() { 1367e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 1377e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com QListWidgetItem* item = fListWidget.item(row); 1388e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com item->setData(Qt::UserRole + 2, QPixmap(":/blank.png")); 139607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDebugger.setCommandVisible(row, true); 1405f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com fSkipCommands[row] = false; 1417e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com } 142cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateImage(); 1437e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com} 1447e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 145902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionClose() { 146902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com this->close(); 147902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 148902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 149902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionDelete() { 1507e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 151dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com for (int row = 0; row < fListWidget.count(); ++row) { 152dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com QListWidgetItem* item = fListWidget.item(row); 153dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com 154dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com if (!item->isSelected()) { 155dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com continue; 156dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com } 157dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com 158dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com if (fDebugger.isCommandVisible(row)) { 159dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com item->setData(Qt::UserRole + 2, QPixmap(":/delete.png")); 160dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fDebugger.setCommandVisible(row, false); 161dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fSkipCommands[row] = true; 162dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com } else { 163dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com item->setData(Qt::UserRole + 2, QPixmap(":/blank.png")); 164dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fDebugger.setCommandVisible(row, true); 165dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fSkipCommands[row] = false; 166dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com } 167902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 1687e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 169cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateImage(); 170902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 171902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 172e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU 17341c79cc0ff3003ef77cb48590f7887221856f941kkinnunenvoid SkDebuggerGUI::actionGLSettingsChanged() { 174fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org bool isToggled = fSettingsWidget.isGLActive(); 175fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org if (isToggled) { 176fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org fCanvasWidget.setGLSampleCount(fSettingsWidget.getGLSampleCount()); 177fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org } 178ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled); 179ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com} 180e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif 181ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 182902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionInspector() { 18341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen bool newState = !fInspectorWidget.isHidden(); 18441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen 18541c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fInspectorWidget.setHidden(newState); 18641c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateFrame.setHidden(newState); 18763a470227beed0de553d769724e0108808391e42kkinnunen fDrawCommandGeometryWidget.setHidden(newState); 188902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 189902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 190902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionPlay() { 191c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = fListWidget.currentRow() + 1; row < fListWidget.count(); 1927dcae67cae277549accdd38d0496b72d00151239chudy@google.com row++) { 193c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem *item = fListWidget.item(row); 194902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (item->checkState() == Qt::Checked) { 195c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentItem(item); 196902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com return; 197902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 198902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 199c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentRow(fListWidget.count() - 1); 200902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 201902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 20241c79cc0ff3003ef77cb48590f7887221856f941kkinnunenvoid SkDebuggerGUI::actionRasterSettingsChanged() { 20341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, 20441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen !fSettingsWidget.isRasterEnabled()); 205cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateImage(); 206768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org} 207768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org 20841c79cc0ff3003ef77cb48590f7887221856f941kkinnunenvoid SkDebuggerGUI::actionVisualizationsChanged() { 20941c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fDebugger.setMegaViz(fSettingsWidget.isMegaVizEnabled()); 21041c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fDebugger.setPathOps(fSettingsWidget.isPathOpsEnabled()); 21141c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fDebugger.highlightCurrentCommand(fSettingsWidget.isVisibilityFilterEnabled()); 212f42fca4027ed4f235ef927786813a5ed0e6652b9robertphillips fDebugger.setOverdrawViz(fSettingsWidget.isOverdrawVizEnabled()); 213cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateImage(); 2142a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org} 2152a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org 21632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comvoid SkDebuggerGUI::actionTextureFilter() { 217e7903c7397c694e343c2c0fcc5cabea351212f23reed SkFilterQuality quality; 218e7903c7397c694e343c2c0fcc5cabea351212f23reed bool enabled = fSettingsWidget.getFilterOverride(&quality); 219e7903c7397c694e343c2c0fcc5cabea351212f23reed fDebugger.setTexFilterOverride(enabled, quality); 22032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com fCanvasWidget.update(); 22132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com} 22232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com 223902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionRewind() { 224e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fListWidget.setCurrentRow(0); 225902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 226902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 2270ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.comvoid SkDebuggerGUI::actionSave() { 228e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com fFileName = fPath.toAscii().data(); 229d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fFileName.append("/"); 230e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com fFileName.append(fDirectoryWidget.currentItem()->text().toAscii().data()); 231d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com saveToFile(fFileName); 2320ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com} 2330ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 2340ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.comvoid SkDebuggerGUI::actionSaveAs() { 2350ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com QString filename = QFileDialog::getSaveFileName(this, "Save File", "", 2360ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com "Skia Picture (*skp)"); 23738b08ce020f451a66263110b32e70f5022df4f83chudy@google.com if (!filename.endsWith(".skp", Qt::CaseInsensitive)) { 2380ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com filename.append(".skp"); 2390ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com } 240c3c8216949146641222f7d2f7a464340627ae43adjsollen@google.com saveToFile(SkString(filename.toAscii().data())); 2410ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com} 2420ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 2437dcae67cae277549accdd38d0496b72d00151239chudy@google.comvoid SkDebuggerGUI::actionScale(float scaleFactor) { 24441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fZoomBox.setText(QString::number(scaleFactor * 100, 'f', 0).append("%")); 2457dcae67cae277549accdd38d0496b72d00151239chudy@google.com} 2467dcae67cae277549accdd38d0496b72d00151239chudy@google.com 247902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionSettings() { 248c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com if (fSettingsWidget.isHidden()) { 249c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setHidden(false); 250902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } else { 251c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setHidden(true); 252902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 253902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 254902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 255902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionStepBack() { 256c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com int currentRow = fListWidget.currentRow(); 257902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (currentRow != 0) { 258c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentRow(currentRow - 1); 259902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 260902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 261902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 262902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionStepForward() { 263c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com int currentRow = fListWidget.currentRow(); 264902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QString curRow = QString::number(currentRow); 265c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QString curCount = QString::number(fListWidget.count()); 266c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com if (currentRow < fListWidget.count() - 1) { 267c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentRow(currentRow + 1); 268902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 269902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 270902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 271a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.comvoid SkDebuggerGUI::drawComplete() { 272cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen SkString clipStack; 273cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fDebugger.getClipStackText(&clipStack); 274cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fInspectorWidget.setText(clipStack.c_str(), SkInspectorWidget::kClipStack_TabType); 275cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen 276607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fInspectorWidget.setMatrix(fDebugger.getCurrentMatrix()); 277607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fInspectorWidget.setClip(fDebugger.getCurrentClip()); 278a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com} 279a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com 280d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::saveToFile(const SkString& filename) { 281d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com SkFILEWStream file(filename.c_str()); 282587ea71a522cd05601b401d17ad207c01f0ee0d6robertphillips sk_sp<SkPicture> copy(fDebugger.copyPicture()); 28325bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com 284db6830162eca5b94e61d9825ec93306fc615d204Hal Canary sk_sp<SkPixelSerializer> serializer(sk_tool_utils::MakePixelSerializer()); 285f530586c417800d086e6e727ecb1b31e678f4183Florin Malita copy->serialize(&file, serializer.get()); 2860ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com} 2870ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 288902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::loadFile(QListWidgetItem *item) { 289a745186c939ec641a861c74064155ec4aa3beb33djsollen if (item == nullptr) { 290a745186c939ec641a861c74064155ec4aa3beb33djsollen return; 291a745186c939ec641a861c74064155ec4aa3beb33djsollen } 292a745186c939ec641a861c74064155ec4aa3beb33djsollen 293a745186c939ec641a861c74064155ec4aa3beb33djsollen SkString fileName(fPath.toAscii().data()); 294a745186c939ec641a861c74064155ec4aa3beb33djsollen // don't add a '/' to files in the local directory 295a745186c939ec641a861c74064155ec4aa3beb33djsollen if (fileName.size() > 0) { 296a745186c939ec641a861c74064155ec4aa3beb33djsollen fileName.append("/"); 297a745186c939ec641a861c74064155ec4aa3beb33djsollen } 298a745186c939ec641a861c74064155ec4aa3beb33djsollen fileName.append(item->text().toAscii().data()); 299a745186c939ec641a861c74064155ec4aa3beb33djsollen 300a745186c939ec641a861c74064155ec4aa3beb33djsollen if (!fileName.equals(fFileName)) { 301a745186c939ec641a861c74064155ec4aa3beb33djsollen fFileName = fileName; 302d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com loadPicture(fFileName); 303902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 304902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 305902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 306902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::openFile() { 307d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com QString temp = QFileDialog::getOpenFileName(this, tr("Open File"), "", 3087dcae67cae277549accdd38d0496b72d00151239chudy@google.com tr("Files (*.*)")); 309ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com openFile(temp); 310ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com} 311ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com 312ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.comvoid SkDebuggerGUI::openFile(const QString &filename) { 313ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com if (!filename.isEmpty()) { 314ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com QFileInfo pathInfo(filename); 315ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com loadPicture(SkString(filename.toAscii().data())); 316ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com setupDirectoryWidget(pathInfo.path()); 317902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 318902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 319902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 320c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.comvoid SkDebuggerGUI::pauseDrawing(bool isPaused) { 321607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fPausedRow = fListWidget.currentRow(); 322cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateDrawCommandInfo(); 3237dcae67cae277549accdd38d0496b72d00151239chudy@google.com} 3247dcae67cae277549accdd38d0496b72d00151239chudy@google.com 3250cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunenvoid SkDebuggerGUI::updateDrawCommandInfo() { 3260cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen int currentRow = -1; 3270cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen if (!fLoading) { 3280cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen currentRow = fListWidget.currentRow(); 3290cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen } 3300cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen if (currentRow == -1) { 3310cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fInspectorWidget.setText("", SkInspectorWidget::kDetail_TabType); 3320cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fInspectorWidget.setText("", SkInspectorWidget::kClipStack_TabType); 3330cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fCurrentCommandBox.setText(""); 3340cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fDrawCommandGeometryWidget.setDrawCommandIndex(-1); 3350cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen } else { 336cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen this->updateImage(); 337cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen 3380cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen const SkTDArray<SkString*> *currInfo = fDebugger.getCommandInfo(currentRow); 3390cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen 3400cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen /* TODO(chudy): Add command type before parameters. Rename v 3410cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen * to something more informative. */ 3420cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen if (currInfo) { 3430cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen QString info; 3440cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen info.append("<b>Parameters: </b><br/>"); 3450cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen for (int i = 0; i < currInfo->count(); i++) { 3460cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen info.append(QString((*currInfo)[i]->c_str())); 3470cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen info.append("<br/>"); 348d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com } 3490cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fInspectorWidget.setText(info, SkInspectorWidget::kDetail_TabType); 350902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 351ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 3520cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fCurrentCommandBox.setText(QString::number(currentRow)); 3530cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen 3540cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fDrawCommandGeometryWidget.setDrawCommandIndex(currentRow); 3550cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen 3560cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fInspectorWidget.setDisabled(false); 3570cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fViewStateFrame.setDisabled(false); 358902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 359902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 360902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 3619ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.comvoid SkDebuggerGUI::selectCommand(int command) { 362f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen if (this->isPaused()) { 3639ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com fListWidget.setCurrentRow(command); 3649ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com } 3659ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com} 3669ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com 367902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleBreakpoint() { 368c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem* item = fListWidget.currentItem(); 369902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (item->checkState() == Qt::Unchecked) { 370902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com item->setCheckState(Qt::Checked); 371e565de4fad5598890124daadf385930043269415chudy@google.com item->setData(Qt::DecorationRole, 3728e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com QPixmap(":/breakpoint_16x16.png")); 373902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } else { 374902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com item->setCheckState(Qt::Unchecked); 375e565de4fad5598890124daadf385930043269415chudy@google.com item->setData(Qt::DecorationRole, 3768e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com QPixmap(":/blank.png")); 377902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 378902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 379902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 380902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleDirectory() { 381607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDirectoryWidget.setHidden(!fDirectoryWidget.isHidden()); 382902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 383902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 384902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleFilter(QString string) { 385c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 386c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem *item = fListWidget.item(row); 387607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com item->setHidden(item->text() != string); 388902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 389902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 390902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 391902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) { 392902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QIcon windowIcon; 3938e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com windowIcon.addFile(QString::fromUtf8(":/skia.png"), QSize(), 3947dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 395902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI")); 396902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com SkDebuggerGUI->resize(1200, 1000); 397902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com SkDebuggerGUI->setWindowIcon(windowIcon); 398c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setWindowTitle("Skia Debugger"); 399902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 400e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionOpen.setShortcuts(QKeySequence::Open); 401c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionOpen.setText("Open"); 402902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 403c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon breakpoint; 4048e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com breakpoint.addFile(QString::fromUtf8(":/breakpoint.png"), 4057dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSize(), QIcon::Normal, QIcon::Off); 406e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B"))); 407c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionBreakpoint.setIcon(breakpoint); 4087e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionBreakpoint.setText("Breakpoints"); 409f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen fActionBreakpoint.setCheckable(true); 410902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 411c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon cancel; 4128e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com cancel.addFile(QString::fromUtf8(":/reload.png"), QSize(), 4137dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 414c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionCancel.setIcon(cancel); 415c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionCancel.setText("Clear Filter"); 416902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 4177e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B"))); 4187e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearBreakpoints.setText("Clear Breakpoints"); 4197e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 4207e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X"))); 4217e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearDeletes.setText("Clear Deletes"); 4227e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 423e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionClose.setShortcuts(QKeySequence::Quit); 424c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionClose.setText("Exit"); 425902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 426e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B"))); 427e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionCreateBreakpoint.setText("Set Breakpoint"); 428e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 429e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionDelete.setShortcut(QKeySequence(tr("X"))); 430c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionDelete.setText("Delete Command"); 431902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 432e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D"))); 433e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionDirectory.setText("Directory"); 434902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 435902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QIcon inspector; 436d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com inspector.addFile(QString::fromUtf8(":/inspector.png"), 4377dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSize(), QIcon::Normal, QIcon::Off); 438e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I"))); 439c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionInspector.setIcon(inspector); 440e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionInspector.setText("Inspector"); 441902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 4422ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com QIcon settings; 4432ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com settings.addFile(QString::fromUtf8(":/inspector.png"), 4442ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com QSize(), QIcon::Normal, QIcon::Off); 4452ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com fActionSettings.setShortcut(QKeySequence(tr("Ctrl+G"))); 4462ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com fActionSettings.setIcon(settings); 4472ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com fActionSettings.setText("Settings"); 4480d55dd7d2c07a77b22478bed9b30ff44ceecad68skia.committer@gmail.com 449c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon play; 450d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com play.addFile(QString::fromUtf8(":/play.png"), QSize(), 4517dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 452e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P"))); 453c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionPlay.setIcon(play); 454c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionPlay.setText("Play"); 455902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 456e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com QIcon pause; 457d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com pause.addFile(QString::fromUtf8(":/pause.png"), QSize(), 4587dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 459e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setShortcut(QKeySequence(tr("Space"))); 460e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setCheckable(true); 461e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setIcon(pause); 462e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setText("Pause"); 463e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 464c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon rewind; 4658e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com rewind.addFile(QString::fromUtf8(":/rewind.png"), QSize(), 466c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon::Normal, QIcon::Off); 467e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R"))); 468c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionRewind.setIcon(rewind); 469c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionRewind.setText("Rewind"); 470902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 4710ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setShortcut(QKeySequence::Save); 4720ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setText("Save"); 4730ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setDisabled(true); 4740ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setShortcut(QKeySequence::SaveAs); 4750ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setText("Save As"); 4760ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setDisabled(true); 4770ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 4787e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X"))); 4797e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionShowDeletes.setText("Deleted Commands"); 480f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen fActionShowDeletes.setCheckable(true); 4817e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 482c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon stepBack; 4838e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com stepBack.addFile(QString::fromUtf8(":/previous.png"), QSize(), 4847dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 485e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionStepBack.setShortcut(QKeySequence(tr("["))); 486c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepBack.setIcon(stepBack); 487c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepBack.setText("Step Back"); 488902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 489c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon stepForward; 4908e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com stepForward.addFile(QString::fromUtf8(":/next.png"), 491c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QSize(), QIcon::Normal, QIcon::Off); 492e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionStepForward.setShortcut(QKeySequence(tr("]"))); 493c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepForward.setIcon(stepForward); 494c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepForward.setText("Step Forward"); 495c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 496a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomIn.setShortcut(QKeySequence(tr("Ctrl+="))); 497a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomIn.setText("Zoom In"); 498a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomOut.setShortcut(QKeySequence(tr("Ctrl+-"))); 499a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomOut.setText("Zoom Out"); 500a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com 501c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setItemDelegate(new SkListWidget(&fListWidget)); 502c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setObjectName(QString::fromUtf8("listWidget")); 503bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fListWidget.setMinimumWidth(250); 504902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 505c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fFilter.addItem("--Filter By Available Commands--"); 506902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 507bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fDirectoryWidget.setMinimumWidth(250); 508c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}"); 509902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 510c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fCanvasWidget.setSizePolicy(QSizePolicy::Expanding, 5117dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSizePolicy::Expanding); 512902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 51363a470227beed0de553d769724e0108808391e42kkinnunen fDrawCommandGeometryWidget.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 5146dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com 5156dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fSettingsAndImageLayout.addWidget(&fSettingsWidget); 5166dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com 51741c79cc0ff3003ef77cb48590f7887221856f941kkinnunen // View state group, part of inspector. 51841c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateFrame.setFrameStyle(QFrame::Panel); 51941c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateFrame.setLayout(&fViewStateFrameLayout); 52041c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateFrameLayout.addWidget(&fViewStateGroup); 52163a470227beed0de553d769724e0108808391e42kkinnunen fViewStateGroup.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); 52241c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateGroup.setTitle("View"); 52341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateLayout.addRow("Zoom Level", &fZoomBox); 52441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fZoomBox.setText("100%"); 52541c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fZoomBox.setMinimumSize(QSize(50,25)); 52641c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fZoomBox.setMaximumSize(QSize(50,25)); 52741c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fZoomBox.setAlignment(Qt::AlignRight); 52841c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fZoomBox.setReadOnly(true); 52941c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateLayout.addRow("Command HitBox", &fCommandHitBox); 53041c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCommandHitBox.setText("0"); 53141c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCommandHitBox.setMinimumSize(QSize(50,25)); 53241c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCommandHitBox.setMaximumSize(QSize(50,25)); 53341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCommandHitBox.setAlignment(Qt::AlignRight); 53441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCommandHitBox.setReadOnly(true); 53541c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateLayout.addRow("Current Command", &fCurrentCommandBox); 53641c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCurrentCommandBox.setText("0"); 53741c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCurrentCommandBox.setMinimumSize(QSize(50,25)); 53841c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCurrentCommandBox.setMaximumSize(QSize(50,25)); 53941c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCurrentCommandBox.setAlignment(Qt::AlignRight); 54041c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCurrentCommandBox.setReadOnly(true); 54141c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateGroup.setLayout(&fViewStateLayout); 54241c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fSettingsAndImageLayout.addWidget(&fViewStateFrame); 54341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen 54463a470227beed0de553d769724e0108808391e42kkinnunen fDrawCommandGeometryWidget.setToolTip("Current Command Geometry"); 54563a470227beed0de553d769724e0108808391e42kkinnunen fSettingsAndImageLayout.addWidget(&fDrawCommandGeometryWidget); 546c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 547bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fLeftColumnSplitter.addWidget(&fListWidget); 548bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fLeftColumnSplitter.addWidget(&fDirectoryWidget); 549bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fLeftColumnSplitter.setOrientation(Qt::Vertical); 550902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 5516dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fCanvasSettingsAndImageLayout.setSpacing(6); 55241c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCanvasSettingsAndImageLayout.addWidget(&fCanvasWidget, 1); 55341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCanvasSettingsAndImageLayout.addLayout(&fSettingsAndImageLayout, 0); 5546dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com 555c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMainAndRightColumnLayout.setSpacing(6); 5567c339ae1e362e9f02cdfb9b32007f143dec0bc0ekkinnunen fMainAndRightColumnLayout.addLayout(&fCanvasSettingsAndImageLayout, 1); 5577c339ae1e362e9f02cdfb9b32007f143dec0bc0ekkinnunen fMainAndRightColumnLayout.addWidget(&fInspectorWidget, 0); 558bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fMainAndRightColumnWidget.setLayout(&fMainAndRightColumnLayout); 559902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 560bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fCentralSplitter.addWidget(&fLeftColumnSplitter); 561bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fCentralSplitter.addWidget(&fMainAndRightColumnWidget); 562bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fCentralSplitter.setStretchFactor(0, 0); 563bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org fCentralSplitter.setStretchFactor(1, 1); 564902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 565bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org SkDebuggerGUI->setCentralWidget(&fCentralSplitter); 566c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setStatusBar(&fStatusBar); 567902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 568e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fToolBar.setIconSize(QSize(32, 32)); 569c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 570c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar); 571902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 5720ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 573902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 574c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionRewind); 575c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionStepBack); 576e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fToolBar.addAction(&fActionPause); 577c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionStepForward); 578c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionPlay); 579c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addSeparator(); 580e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fToolBar.addAction(&fActionInspector); 5812ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com fToolBar.addAction(&fActionSettings); 582d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 583d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fToolBar.addSeparator(); 5840ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fToolBar.addWidget(&fSpacer); 585c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addWidget(&fFilter); 586c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionCancel); 587902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 588d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fFileName = ""; 589ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com setupDirectoryWidget(""); 590902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 591902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Menu Bar 592c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuFile.setTitle("File"); 593c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuFile.addAction(&fActionOpen); 5940ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fMenuFile.addAction(&fActionSave); 5950ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fMenuFile.addAction(&fActionSaveAs); 596c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuFile.addAction(&fActionClose); 597e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 598e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuEdit.setTitle("Edit"); 599e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuEdit.addAction(&fActionDelete); 6007e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuEdit.addAction(&fActionClearDeletes); 6017e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuEdit.addSeparator(); 602e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuEdit.addAction(&fActionCreateBreakpoint); 6037e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuEdit.addAction(&fActionClearBreakpoints); 604e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 605c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuNavigate.setTitle("Navigate"); 606e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionRewind); 607e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionStepBack); 608e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionStepForward); 609e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionPlay); 610e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionPause); 611c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuNavigate.addAction(&fActionGoToLine); 612e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 613c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuView.setTitle("View"); 614e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuView.addAction(&fActionBreakpoint); 6157e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuView.addAction(&fActionShowDeletes); 616a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fMenuView.addAction(&fActionZoomIn); 617a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fMenuView.addAction(&fActionZoomOut); 618e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 619e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuWindows.setTitle("Window"); 620e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuWindows.addAction(&fActionInspector); 6212ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com fMenuWindows.addAction(&fActionSettings); 622e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuWindows.addAction(&fActionDirectory); 623c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 624c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionGoToLine.setText("Go to Line..."); 625c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionGoToLine.setDisabled(true); 626c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuBar.addAction(fMenuFile.menuAction()); 627e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuBar.addAction(fMenuEdit.menuAction()); 628c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuBar.addAction(fMenuView.menuAction()); 629c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuBar.addAction(fMenuNavigate.menuAction()); 630e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuBar.addAction(fMenuWindows.menuAction()); 631902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 632c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setMenuBar(&fMenuBar); 633902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QMetaObject::connectSlotsByName(SkDebuggerGUI); 634902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 635902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 636ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.comvoid SkDebuggerGUI::setupDirectoryWidget(const QString& path) { 637ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com fPath = path; 638a745186c939ec641a861c74064155ec4aa3beb33djsollen populateDirectoryWidget(); 639a745186c939ec641a861c74064155ec4aa3beb33djsollen 640a745186c939ec641a861c74064155ec4aa3beb33djsollen // clear the existing watched directory and setup a new directory to watch 641a745186c939ec641a861c74064155ec4aa3beb33djsollen if (!fDirectoryWatcher.directories().empty()) { 642a745186c939ec641a861c74064155ec4aa3beb33djsollen fDirectoryWatcher.removePaths(fDirectoryWatcher.directories()); 643a745186c939ec641a861c74064155ec4aa3beb33djsollen } 644a745186c939ec641a861c74064155ec4aa3beb33djsollen if (!path.isEmpty()) { 645a745186c939ec641a861c74064155ec4aa3beb33djsollen fDirectoryWatcher.addPath(fPath); 646a745186c939ec641a861c74064155ec4aa3beb33djsollen } 647a745186c939ec641a861c74064155ec4aa3beb33djsollen} 648a745186c939ec641a861c74064155ec4aa3beb33djsollen 649a745186c939ec641a861c74064155ec4aa3beb33djsollenvoid SkDebuggerGUI::populateDirectoryWidget() { 650a745186c939ec641a861c74064155ec4aa3beb33djsollen QDir dir(fPath); 651902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QRegExp r(".skp"); 652c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com const QStringList files = dir.entryList(); 653a745186c939ec641a861c74064155ec4aa3beb33djsollen 654a745186c939ec641a861c74064155ec4aa3beb33djsollen // check if a file has been removed 655a745186c939ec641a861c74064155ec4aa3beb33djsollen for (int i = fDirectoryWidget.count() - 1; i >= 0; i--) { 656a745186c939ec641a861c74064155ec4aa3beb33djsollen QListWidgetItem* item = fDirectoryWidget.item(i); 657a745186c939ec641a861c74064155ec4aa3beb33djsollen if (!files.contains(item->text())) { 658a745186c939ec641a861c74064155ec4aa3beb33djsollen fDirectoryWidget.removeItemWidget(item); 659a745186c939ec641a861c74064155ec4aa3beb33djsollen delete item; 660a745186c939ec641a861c74064155ec4aa3beb33djsollen } 661a745186c939ec641a861c74064155ec4aa3beb33djsollen } 662a745186c939ec641a861c74064155ec4aa3beb33djsollen 663a745186c939ec641a861c74064155ec4aa3beb33djsollen // add any new files 6649ea8acdf3ff8b7787e59de8c393e12a72b34ddc0robertphillips Q_FOREACH (QString f, files) { 665a745186c939ec641a861c74064155ec4aa3beb33djsollen if (f.contains(r) && fDirectoryWidget.findItems(f, Qt::MatchExactly).size() == 0) { 666c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fDirectoryWidget.addItem(f); 667a745186c939ec641a861c74064155ec4aa3beb33djsollen } 668902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 669902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 670902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 671d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::loadPicture(const SkString& fileName) { 672d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fFileName = fileName; 673d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fLoading = true; 674f530586c417800d086e6e727ecb1b31e678f4183Florin Malita SkFILEStream stream(fileName.c_str()); 6752d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com 676f530586c417800d086e6e727ecb1b31e678f4183Florin Malita auto picture = SkPicture::MakeFromStream(&stream); 6772d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com 67896fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == picture) { 6792d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com QMessageBox::critical(this, "Error loading file", "Couldn't read file, sorry."); 6802d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com return; 6812d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com } 6822bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 683686e68019374dca3692cac6d5f8d94515e53d6c8chudy@google.com fCanvasWidget.resetWidgetTransform(); 684ca2622ba051829fed5f30facd74c5b41cd4b931creed fDebugger.loadPicture(picture.get()); 6854c7962e0a866b8416fa7046791c129eb5430b677chudy@google.com 6866d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com fSkipCommands.setCount(fDebugger.getSize()); 6876d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com for (int i = 0; i < fSkipCommands.count(); ++i) { 6885f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com fSkipCommands[i] = false; 6895f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com } 6905f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com 691ca2622ba051829fed5f30facd74c5b41cd4b931creed picture.reset(); 692607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com 6937dcae67cae277549accdd38d0496b72d00151239chudy@google.com /* fDebugCanvas is reinitialized every load picture. Need it to retain value 694607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * of the visibility filter. 695607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * TODO(chudy): This should be deprecated since fDebugger is not 696607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * recreated. 697607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * */ 69841c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fDebugger.highlightCurrentCommand(fSettingsWidget.isVisibilityFilterEnabled()); 699607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com 7005037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen this->setupListWidget(); 7015037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen this->setupComboBox(); 70296fcdcc219d2a0d3579719b84b28bede76efba64halcanary this->setupOverviewText(nullptr, 0.0, 1); 7037e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fInspectorWidget.setDisabled(false); 70441c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fViewStateFrame.setDisabled(false); 705e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com fSettingsWidget.setDisabled(false); 706d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuEdit.setDisabled(false); 707d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuNavigate.setDisabled(false); 708d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuView.setDisabled(false); 7090ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setDisabled(false); 7100ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setDisabled(false); 711f3a9e993399fcb8dae4bf6f1dd9674a72b289da3kkinnunen fActionPause.setChecked(false); 7120cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen fDrawCommandGeometryWidget.setDrawCommandIndex(-1); 7130cfeaf3ac1e7edcf3b618c9f33f4b4bc30321324kkinnunen 714d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fLoading = false; 715d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com actionPlay(); 716902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 717902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 7185037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunenvoid SkDebuggerGUI::setupListWidget() { 719546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips 720546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips SkASSERT(!strcmp("Save", 721546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips SkDrawCommand::GetCommandString(SkDrawCommand::kSave_OpType))); 722546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips SkASSERT(!strcmp("SaveLayer", 723546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips SkDrawCommand::GetCommandString(SkDrawCommand::kSaveLayer_OpType))); 724546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips SkASSERT(!strcmp("Restore", 725546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips SkDrawCommand::GetCommandString(SkDrawCommand::kRestore_OpType))); 726160ebb2bfa0794d72d31a786793b13413289863dfmalita SkASSERT(!strcmp("BeginDrawPicture", 727160ebb2bfa0794d72d31a786793b13413289863dfmalita SkDrawCommand::GetCommandString(SkDrawCommand::kBeginDrawPicture_OpType))); 728160ebb2bfa0794d72d31a786793b13413289863dfmalita SkASSERT(!strcmp("EndDrawPicture", 729160ebb2bfa0794d72d31a786793b13413289863dfmalita SkDrawCommand::GetCommandString(SkDrawCommand::kEndDrawPicture_OpType))); 730546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips 731c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.clear(); 732902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com int counter = 0; 73330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com int indent = 0; 7345037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen for (int i = 0; i < fDebugger.getSize(); i++) { 735902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QListWidgetItem *item = new QListWidgetItem(); 7365037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen SkDrawCommand* command = fDebugger.getDrawCommandAt(i); 7375037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen SkString commandString = command->toString(); 7385037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen item->setData(Qt::DisplayRole, commandString.c_str()); 739902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com item->setData(Qt::UserRole + 1, counter++); 74030d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 7415037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen if (0 == strcmp("Restore", commandString.c_str()) || 742160ebb2bfa0794d72d31a786793b13413289863dfmalita 0 == strcmp("EndDrawPicture", commandString.c_str())) { 74330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com indent -= 10; 74430d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com } 74530d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 74630d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com item->setData(Qt::UserRole + 3, indent); 74730d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 7485037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen if (0 == strcmp("Save", commandString.c_str()) || 749546db46a76ad5f7485cebeb27efaf8b4806fa914robertphillips 0 == strcmp("SaveLayer", commandString.c_str()) || 750160ebb2bfa0794d72d31a786793b13413289863dfmalita 0 == strcmp("BeginDrawPicture", commandString.c_str())) { 75130d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com indent += 10; 75230d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com } 75330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 75457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org item->setData(Qt::UserRole + 4, -1); 755d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 756c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.addItem(item); 757902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 758902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 759902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 76091274b99722d9be62e077ab979c630c23cdd04b1skia.committer@gmail.comvoid SkDebuggerGUI::setupOverviewText(const SkTDArray<double>* typeTimes, 761e428f9b1132c12299c204a333192495d7e748511robertphillips@google.com double totTime, 762e428f9b1132c12299c204a333192495d7e748511robertphillips@google.com int numRuns) { 7632d9dbd4f78314b4b36f67d6ebbf3e0f2d9a163e3borenet@google.com SkString overview; 764e428f9b1132c12299c204a333192495d7e748511robertphillips@google.com fDebugger.getOverviewText(typeTimes, totTime, &overview, numRuns); 7652d9dbd4f78314b4b36f67d6ebbf3e0f2d9a163e3borenet@google.com fInspectorWidget.setText(overview.c_str(), SkInspectorWidget::kOverview_TabType); 7668a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com} 7678a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 7682a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org 7695037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunenvoid SkDebuggerGUI::setupComboBox() { 7708a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fFilter.clear(); 7718a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fFilter.addItem("--Filter By Available Commands--"); 7728a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 7738a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com std::map<std::string, int> map; 7745037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen for (int i = 0; i < fDebugger.getSize(); i++) { 7755037e9de94e57d36592cc596d831cc2b5ec45bd3kkinnunen map[fDebugger.getDrawCommandAt(i)->toString().c_str()]++; 7768a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 7778a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 7783458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com for (std::map<std::string, int>::iterator it = map.begin(); it != map.end(); 7798a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com ++it) { 7808a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fFilter.addItem((it->first).c_str()); 7818a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 782902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 783902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // NOTE(chudy): Makes first item unselectable. 7847dcae67cae277549accdd38d0496b72d00151239chudy@google.com QStandardItemModel* model = qobject_cast<QStandardItemModel*>( 785c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fFilter.model()); 786c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QModelIndex firstIndex = model->index(0, fFilter.modelColumn(), 787c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fFilter.rootModelIndex()); 788902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QStandardItem* firstItem = model->itemFromIndex(firstIndex); 789902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com firstItem->setSelectable(false); 790902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 79141c79cc0ff3003ef77cb48590f7887221856f941kkinnunen 792cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunenvoid SkDebuggerGUI::updateImage() { 793cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen if (this->isPaused()) { 794cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fCanvasWidget.drawTo(fPausedRow); 795cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } else { 796cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen fCanvasWidget.drawTo(fListWidget.currentRow()); 797cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen } 798cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen} 799cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen 80041c79cc0ff3003ef77cb48590f7887221856f941kkinnunenvoid SkDebuggerGUI::updateHit(int newHit) { 80141c79cc0ff3003ef77cb48590f7887221856f941kkinnunen fCommandHitBox.setText(QString::number(newHit)); 80241c79cc0ff3003ef77cb48590f7887221856f941kkinnunen} 80341c79cc0ff3003ef77cb48590f7887221856f941kkinnunen 804