clt debugger
Review URL: https://codereview.appspot.com/6267043
git-svn-id: http://skia.googlecode.com/svn/trunk@4404 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
new file mode 100644
index 0000000..9c98f48
--- /dev/null
+++ b/debugger/QT/SkDebuggerGUI.cpp
@@ -0,0 +1,593 @@
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <iostream>
+#include "SkDebuggerGUI.h"
+#include <QListWidgetItem>
+
+SkDebuggerGUI::SkDebuggerGUI(QWidget *parent) :
+ QMainWindow(parent) {
+
+ setupUi(this);
+ connect(fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,
+ QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *)));
+ connect(fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
+ connect(fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()));
+ connect(fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*,
+ QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *)));
+ connect(fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
+ connect(fActionReload, SIGNAL(triggered()), this, SLOT(actionReload()));
+ connect(fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint()));
+ connect(fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
+ connect(fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
+ connect(fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
+ connect(fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward()));
+ connect(fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints()));
+ connect(fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()));
+ connect(fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString)));
+ connect(fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
+ connect(fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
+ connect(fActionSettings, SIGNAL(triggered()), this, SLOT(actionSettings()));
+ connect(fActionToggleCurrentCommand, SIGNAL(triggered()), this, SLOT(actionCommandFilter()));
+}
+
+SkDebuggerGUI::~SkDebuggerGUI() {
+}
+
+void SkDebuggerGUI::actionBreakpoints() {
+ if(!fBreakpointsActivated) {
+ fBreakpointsActivated = true;
+ } else {
+ fBreakpointsActivated = false;
+ }
+
+ for(int row=0; row<fListWidget->count(); row++) {
+ QListWidgetItem *item = fListWidget->item(row);
+
+ if (item->checkState() == Qt::Unchecked && fBreakpointsActivated) {
+ item->setHidden(true);
+ } else {
+ item->setHidden(false);
+ }
+ }
+}
+
+void SkDebuggerGUI::actionCancel() {
+ for(int row=0; row<fListWidget->count(); row++) {
+ fListWidget->item(row)->setHidden(false);
+ }
+}
+
+void SkDebuggerGUI::actionCommandFilter() {
+ if (fActionToggleCurrentCommand->text() == "Show Filter") {
+ fCanvasWidget->toggleCurrentCommandFilter(true);
+ fActionToggleCurrentCommand->setText("Hide Filter");
+ } else {
+ fActionToggleCurrentCommand->setText("Show Filter");
+ fCanvasWidget->toggleCurrentCommandFilter(false);
+ }
+
+ fCanvasWidget->drawTo(fListWidget->currentRow());
+
+}
+
+void SkDebuggerGUI::actionClose() {
+ this->close();
+}
+
+void SkDebuggerGUI::actionDelete() {
+ QListWidgetItem* item = fListWidget->currentItem();
+
+ if(item->data(Qt::UserRole + 2) == true) {
+ item->setData(Qt::UserRole + 2, false);
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/delete.png"));
+
+ } else {
+ item->setData(Qt::UserRole + 2, true);
+ if(item->checkState() == Qt::Unchecked) {
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/blank.png"));
+ } else {
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/breakpoint_16x16.png"));
+ }
+
+ }
+
+ int currentRow = fListWidget->currentRow();
+
+ // NOTE(chudy): Forces a redraw up to current selected command.
+ if (fCanvasWidget) {
+ fCanvasWidget->toggleCommand(currentRow);
+ fCanvasWidget->drawTo(currentRow);
+ }
+}
+
+void SkDebuggerGUI::actionInspector() {
+ if (fInspectorWidget->isHidden()) {
+ fInspectorWidget->setHidden(false);
+ } else {
+ fInspectorWidget->setHidden(true);
+ }
+}
+
+void SkDebuggerGUI::actionPlay() {
+ for(int row=fListWidget->currentRow()+1; row<fListWidget->count(); row++) {
+ QListWidgetItem *item = fListWidget->item(row);
+ if (item->checkState() == Qt::Checked) {
+ fListWidget->setCurrentItem(item);
+ return;
+ }
+ }
+
+ fListWidget->setCurrentRow(fListWidget->count() - 1);
+}
+
+void SkDebuggerGUI::actionReload() {
+ for(int row=0; row<fListWidget->count(); row++) {
+ QListWidgetItem* item = fListWidget->item(row);
+ item->setData(Qt::UserRole + 2, true);
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/blank.png"));
+ fCanvasWidget->toggleCommand(row, true);
+ }
+
+ fCanvasWidget->drawTo(fListWidget->currentRow());
+}
+
+void SkDebuggerGUI::actionRewind() {
+ /* NOTE(chudy): Hack. All skps opened so far start with save and concat
+ * commands that don't clear or reset the canvas. */
+ fListWidget->setCurrentRow(2);
+}
+
+void SkDebuggerGUI::actionSettings() {
+ if (fSettingsWidget->isHidden()) {
+ fSettingsWidget->setHidden(false);
+ } else {
+ fSettingsWidget->setHidden(true);
+ }
+}
+
+void SkDebuggerGUI::actionStepBack() {
+ int currentRow = fListWidget->currentRow();
+ if (currentRow != 0) {
+ fListWidget->setCurrentRow(currentRow - 1);
+ }
+}
+
+void SkDebuggerGUI::actionStepForward() {
+ int currentRow = fListWidget->currentRow();
+
+ QString curRow = QString::number(currentRow);
+ QString curCount = QString::number(fListWidget->count());
+
+
+ if (currentRow < fListWidget->count() - 1) {
+ fListWidget->setCurrentRow(currentRow + 1);
+ }
+}
+
+void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
+ if (fDirectoryWidgetActive) {
+ QString fileName;
+ fileName.append(fPath);
+ fileName.append("/");
+ fileName.append(item->text());
+ loadPicture(fileName);
+ }
+}
+
+void SkDebuggerGUI::openFile() {
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
+ "",
+ tr("Files (*.*)"));
+ fDirectoryWidgetActive = false;
+ if (!fileName.isNull()) {
+
+ QFileInfo pathInfo(fileName);
+ fPath = pathInfo.path();
+ loadPicture(fileName);
+ setupDirectoryWidget();
+ }
+ /* TODO(chudy): Need something here that sets the active directory
+ * widget selection to what was opened. OR we can just add a new function
+ * to change the directory (would be much easier).
+ */
+ fDirectoryWidgetActive = true;
+}
+
+void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
+ int currentRow = fListWidget->currentRow();
+
+ // NOTE(chudy): Prevents initialization errors.
+ if (fCanvasWidget) {
+ fCanvasWidget->drawTo(currentRow);
+ std::vector<std::string> *v =
+ fCanvasWidget->getCurrentCommandInfo(currentRow);
+
+
+ /* TODO(chudy): Add command type before parameters. Rename v
+ * to something more informative. */
+ if (v) {
+ std::vector<std::string>::iterator it;
+
+ QString info;
+ info.append("<b>Parameters: </b><br/>");
+ for (it = v->begin(); it != v->end(); ++it) {
+ info.append(QString((*it).c_str()));
+ info.append("<br/>");
+ }
+ fInspectorWidget->setDetailText(info);
+ }
+ }
+}
+
+void SkDebuggerGUI::toggleBreakpoint() {
+ QListWidgetItem* item = fListWidget->currentItem();
+ if (item->checkState() == Qt::Unchecked) {
+ item->setCheckState(Qt::Checked);
+
+
+ /* NOTE(chudy): If the command is toggled as hidden that takes
+ * precendence over the breakpoint icon.
+ */
+ if(item->data(Qt::UserRole + 2) == false) {
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/delete.png"));
+ } else {
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/breakpoint_16x16.png"));
+ }
+
+ } else {
+
+ /* NOTE(chudy): When untoggling as a breakpoint if the command
+ * is hidden then the portraying icon should remain the delete icon.
+ */
+ item->setCheckState(Qt::Unchecked);
+
+ if(item->data(Qt::UserRole + 2) == false) {
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/delete.png"));
+ } else {
+ item->setData(Qt::DecorationRole,
+ QPixmap(":/images/Icons/blank.png"));
+ }
+
+ }
+}
+
+void SkDebuggerGUI::toggleDirectory() {
+ if (fDirectoryWidget->isHidden()) {
+ fDirectoryWidget->setHidden(false);
+ } else {
+ fDirectoryWidget->setHidden(true);
+ }
+}
+
+void SkDebuggerGUI::toggleFilter(QString string) {
+ for(int row=0; row<fListWidget->count(); row++) {
+ QListWidgetItem *item = fListWidget->item(row);
+ if (item->text() == string) {
+ item->setHidden(false);
+ } else {
+ item->setHidden(true);
+ }
+ }
+}
+
+void SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
+ QIcon windowIcon;
+ windowIcon.addFile(QString::fromUtf8(":/images/Icons/skia.png"), QSize(), QIcon::Normal, QIcon::Off);
+ SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
+ SkDebuggerGUI->resize(1200, 1000);
+ SkDebuggerGUI->setWindowIcon(windowIcon);
+
+ QIcon open;
+ open.addFile(QString::fromUtf8(":/images/Icons/package-br32.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionOpen = new QAction(SkDebuggerGUI);
+ fActionOpen->setObjectName(QString::fromUtf8("actionOpen"));
+ fActionOpen->setIcon(open);
+
+ QIcon directory;
+ directory.addFile(QString::fromUtf8(":/images/Icons/drawer-open-icon.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionDirectory = new QAction(SkDebuggerGUI);
+ fActionDirectory->setObjectName(QString::fromUtf8("actionDirectory"));
+ fActionDirectory->setIcon(directory);
+ fActionDirectory->setText("Toggle Directory");
+
+ QIcon rewind;
+ rewind.addFile(QString::fromUtf8(":/images/Icons/rewind.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionRewind = new QAction(SkDebuggerGUI);
+ fActionRewind->setObjectName(QString::fromUtf8("actionRewind"));
+ fActionRewind->setIcon(rewind);
+ fActionRewind->setText("Rewind");
+
+ QIcon stepBack;
+ stepBack.addFile(QString::fromUtf8(":/images/Icons/back.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionStepBack = new QAction(SkDebuggerGUI);
+ fActionStepBack->setObjectName(QString::fromUtf8("actionStepBack"));
+ fActionStepBack->setIcon(stepBack);
+ fActionStepBack->setText("Step Back");
+
+ QIcon stepForward;
+ stepForward.addFile(QString::fromUtf8(":/images/Icons/go-next.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionStepForward = new QAction(SkDebuggerGUI);
+ fActionStepForward->setObjectName(QString::fromUtf8("actionStepBack"));
+ fActionStepForward->setIcon(stepForward);
+ fActionStepForward->setText("Step Forward");
+
+ QIcon play;
+ play.addFile(QString::fromUtf8(":/images/Icons/play.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionPlay = new QAction(SkDebuggerGUI);
+ fActionPlay->setObjectName(QString::fromUtf8("actionPlay"));
+ fActionPlay->setIcon(play);
+ fActionPlay->setText("Play");
+
+ QIcon breakpoint;
+ breakpoint.addFile(QString::fromUtf8(":/images/Icons/breakpoint.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionBreakpoint = new QAction(SkDebuggerGUI);
+ fActionBreakpoint->setObjectName(QString::fromUtf8("actionBreakpoint"));
+ fActionBreakpoint->setIcon(breakpoint);
+ fActionBreakpoint->setText("Show Breakpoints");
+
+ QIcon inspector;
+ inspector.addFile(QString::fromUtf8(":/images/Icons/inspector.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionInspector = new QAction(SkDebuggerGUI);
+ fActionInspector->setObjectName(QString::fromUtf8("actionInspector"));
+ fActionInspector->setIcon(inspector);
+ fActionInspector->setText("Inspector");
+
+ QIcon deleteIcon;
+ deleteIcon.addFile(QString::fromUtf8(":/images/Icons/delete.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionDelete = new QAction(SkDebuggerGUI);
+ fActionDelete->setObjectName(QString::fromUtf8("actionDelete"));
+ fActionDelete->setIcon(deleteIcon);
+ fActionDelete->setText("Delete Command");
+
+ QIcon reload;
+ reload.addFile(QString::fromUtf8(":/images/Icons/reload.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionReload = new QAction(SkDebuggerGUI);
+ fActionReload->setObjectName(QString::fromUtf8("actionReload"));
+ fActionReload->setIcon(reload);
+ fActionReload->setText("Reset Picture");
+
+ QIcon settings;
+ settings.addFile(QString::fromUtf8(":/images/Icons/settings.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionSettings = new QAction(SkDebuggerGUI);
+ fActionSettings->setObjectName(QString::fromUtf8("actionSettings"));
+ fActionSettings->setIcon(settings);
+ fActionSettings->setText("Settings");
+
+ QIcon cancel;
+ cancel.addFile(QString::fromUtf8(":/images/Icons/reset.png"), QSize(), QIcon::Normal, QIcon::Off);
+ fActionCancel = new QAction(SkDebuggerGUI);
+ fActionCancel->setObjectName(QString::fromUtf8("actionCancel"));
+ fActionCancel->setIcon(cancel);
+ fActionCancel->setText("Clear Filter");
+
+ fCentralWidget = new QWidget(SkDebuggerGUI);
+ fCentralWidget->setObjectName(QString::fromUtf8("centralWidget"));
+
+ fHorizontalLayout = new QHBoxLayout(fCentralWidget);
+ fHorizontalLayout->setSpacing(6);
+ fHorizontalLayout->setContentsMargins(11, 11, 11, 11);
+ fHorizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
+
+ fVerticalLayout = new QVBoxLayout();
+ fVerticalLayout->setSpacing(6);
+ fVerticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
+
+ fVerticalLayout_2 = new QVBoxLayout();
+ fVerticalLayout_2->setSpacing(6);
+ fVerticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
+
+ fListWidget = new QListWidget(fCentralWidget);
+ fListWidget->setItemDelegate(new SkListWidget(fListWidget));
+ fListWidget->setObjectName(QString::fromUtf8("listWidget"));
+ fListWidget->setMaximumWidth(250);
+
+ fInspectorWidget = new SkInspectorWidget();
+ fInspectorWidget->setObjectName(QString::fromUtf8("inspectorWidget"));
+ fInspectorWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ fInspectorWidget->setMaximumHeight(300);
+
+ fFilter = new QComboBox(fCentralWidget);
+ fFilter->setObjectName(QString::fromUtf8("comboBox"));
+ fFilter->addItem("--Filter By Available Commands--");
+
+ fDirectoryWidget = new QListWidget(fCentralWidget);
+ fDirectoryWidget->setObjectName(QString::fromUtf8("listWidget_2"));
+ fDirectoryWidget->setMaximumWidth(250);
+ fDirectoryWidget->setStyleSheet("QListWidget::Item {padding: 5px;}");
+
+ fVerticalLayout_2->addWidget(fListWidget);
+ fVerticalLayout_2->addWidget(fDirectoryWidget);
+
+ fCanvasWidget = new SkCanvasWidget(fCentralWidget);
+ fCanvasWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ fSettingsWidget = new SkSettingsWidget(fCentralWidget);
+ fSettingsWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ fSettingsWidget->setMaximumWidth(250);
+ fSettingsWidget->setHidden(true);
+
+ fHorizontalLayout_2 = new QHBoxLayout();
+ fHorizontalLayout_2->setSpacing(6);
+
+ fHorizontalLayout_2->addWidget(fCanvasWidget);
+ fHorizontalLayout_2->addWidget(fSettingsWidget);
+
+ fVerticalLayout->addLayout(fHorizontalLayout_2);
+ fVerticalLayout->addWidget(fInspectorWidget);
+
+ fHorizontalLayout->addLayout(fVerticalLayout_2);
+ fHorizontalLayout->addLayout(fVerticalLayout);
+
+ SkDebuggerGUI->setCentralWidget(fCentralWidget);
+ fStatusBar = new QStatusBar(SkDebuggerGUI);
+ fStatusBar->setObjectName(QString::fromUtf8("statusBar"));
+ SkDebuggerGUI->setStatusBar(fStatusBar);
+ fToolBar = new QToolBar(SkDebuggerGUI);
+ fToolBar->setObjectName(QString::fromUtf8("toolBar"));
+ fToolBar->setIconSize(QSize(24, 24));
+ //fToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, fToolBar);
+
+ QWidget *spacer = new QWidget();
+ spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ fToolBar->addAction(fActionOpen);
+ fToolBar->addSeparator();
+ fToolBar->addAction(fActionDirectory);
+ fToolBar->addSeparator();
+ fToolBar->addAction(fActionRewind);
+ fToolBar->addAction(fActionStepBack);
+ fToolBar->addAction(fActionStepForward);
+ fToolBar->addAction(fActionPlay);
+ fToolBar->addSeparator();
+ fToolBar->addAction(fActionBreakpoint);
+ fToolBar->addAction(fActionInspector);
+ fToolBar->addSeparator();
+ fToolBar->addAction(fActionDelete);
+ fToolBar->addAction(fActionReload);
+ fToolBar->addSeparator();
+ fToolBar->addAction(fActionSettings);
+ fToolBar->addWidget(spacer);
+ fToolBar->addWidget(fFilter);
+ fToolBar->addAction(fActionCancel);
+
+ // TODO(chudy): Remove static call.
+ fDirectoryWidgetActive = false;
+ fPath= "/usr/local/google/home/chudy/trunk-linux/debugger/skp";
+ setupDirectoryWidget();
+ fDirectoryWidgetActive = true;
+
+ fMenuBar = new QMenuBar(SkDebuggerGUI);
+
+ // File
+ fMenuFile = new QMenu(SkDebuggerGUI);
+ fMenuFile->setTitle("File");
+
+ fActionClose = new QAction(SkDebuggerGUI);
+ fActionClose->setText("Close");
+
+ fMenuFile->addAction(fActionOpen);
+ fMenuFile->addAction(fActionClose);
+
+ // View
+ fMenuView = new QMenu(SkDebuggerGUI);
+ fMenuView->setTitle("View");
+
+ fActionToggleCurrentCommand = new QAction(SkDebuggerGUI);
+ fActionToggleCurrentCommand->setText("Show Filter");
+
+ fMenuView->addAction(fActionToggleCurrentCommand);
+
+ // Navigate
+ fMenuNavigate = new QMenu(SkDebuggerGUI);
+ fMenuNavigate->setTitle("Navigate");
+
+ fActionGoToLine = new QAction(SkDebuggerGUI);
+ fActionGoToLine->setText("Go to Line...");
+ fActionGoToLine->setDisabled(true);
+
+ fMenuNavigate->addAction(fActionGoToLine);
+
+ // Menu Bar
+ fMenuBar->addAction(fMenuFile->menuAction());
+ fMenuBar->addAction(fMenuView->menuAction());
+ fMenuBar->addAction(fMenuNavigate->menuAction());
+
+ SkDebuggerGUI->setMenuBar(fMenuBar);
+
+ retranslateUi(SkDebuggerGUI);
+ QMetaObject::connectSlotsByName(SkDebuggerGUI);
+}
+
+void SkDebuggerGUI::setupDirectoryWidget() {
+ fDir = new QDir(fPath);
+ QRegExp r(".skp");
+ fDirectoryWidget->clear();
+ const QStringList files = fDir->entryList();
+ foreach (QString f, files) {
+ if (f.contains(r)) fDirectoryWidget->addItem(f);
+ }
+}
+
+// TODO(chudy): Is this necessary?
+void SkDebuggerGUI::retranslateUi(QMainWindow *SkDebuggerGUI) {
+ SkDebuggerGUI->setWindowTitle(QApplication::translate("SkDebuggerGUI", "SkDebuggerGUI", 0, QApplication::UnicodeUTF8));
+ fActionOpen->setText(QApplication::translate("SkDebuggerGUI", "Open", 0, QApplication::UnicodeUTF8));
+ fToolBar->setWindowTitle(QApplication::translate("SkDebuggerGUI", "toolBar", 0, QApplication::UnicodeUTF8));
+}
+
+void SkDebuggerGUI::loadPicture(QString fileName) {
+ fCanvasWidget->loadPicture(fileName);
+ std::vector<std::string> *cv = fCanvasWidget->getDrawCommands();
+ setupListWidget(cv);
+ setupComboBox(cv);
+}
+
+void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) {
+ fListWidget->clear();
+ int counter = 0;
+ for (unsigned int i = 0; i < cv->size(); i++) {
+ QListWidgetItem *item = new QListWidgetItem();
+ item->setData(Qt::DisplayRole, (*cv)[i].c_str());
+ item->setData(Qt::UserRole + 1, counter++);
+ item->setData(Qt::UserRole + 2, true);
+ fListWidget->addItem(item);
+ }
+}
+
+void SkDebuggerGUI::setupComboBox(std::vector<std::string>* cv) {
+ fFilter->clear();
+ fFilter->addItem("--Filter By Available Commands--");
+
+ std::map<std::string, int> map;
+ for (unsigned int i = 0; i < cv->size(); i++) {
+ map[(*cv)[i]]++;
+ }
+
+ QString overview;
+ int counter;
+ for(std::map<std::string, int>::iterator it = map.begin(); it != map.end(); ++it) {
+ overview.append((it->first).c_str());
+ overview.append(": ");
+ overview.append(QString::number(it->second));
+ overview.append("<br/>");
+ counter+=it->second;
+ fFilter->addItem((it->first).c_str());
+ }
+ QString total;
+ total.append("Total Draw Commands: ");
+ total.append(QString::number(counter));
+ total.append("<br/>");
+ overview.insert(0, total);
+
+ overview.append("<br/>");
+ overview.append("SkBitmap Width: ");
+ // NOTE(chudy): This is where we can pull out the SkPictures width.
+ overview.append(QString::number(fCanvasWidget->getBitmapWidth()));
+ overview.append("px<br/>");
+ overview.append("SkBitmap Height: ");
+ overview.append(QString::number(fCanvasWidget->getBitmapHeight()));
+ overview.append("px");
+ fInspectorWidget->setOverviewText(overview);
+
+ // NOTE(chudy): Makes first item unselectable.
+ QStandardItemModel* model =
+ qobject_cast<QStandardItemModel*>(fFilter->model());
+ QModelIndex firstIndex = model->index(0, fFilter->modelColumn(),
+ fFilter->rootModelIndex());
+ QStandardItem* firstItem = model->itemFromIndex(firstIndex);
+ firstItem->setSelectable(false);
+}