Skia Debugger can now save modified pictures.

Review URL: https://codereview.appspot.com/6442055

git-svn-id: http://skia.googlecode.com/svn/trunk@4821 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
index 823fffc..830f0f6 100644
--- a/debugger/QT/SkDebuggerGUI.cpp
+++ b/debugger/QT/SkDebuggerGUI.cpp
@@ -25,6 +25,8 @@
     , fActionPlay(this)
     , fActionPause(this)
     , fActionRewind(this)
+    , fActionSave(this)
+    , fActionSaveAs(this)
     , fActionShowDeletes(this)
     , fActionStepBack(this)
     , fActionStepForward(this)
@@ -78,6 +80,8 @@
     connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int)));
     connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float)));
     connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int)));
+    connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs()));
+    connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave()));
 
     fMapper.setMapping(&fActionZoomIn, 1);
     fMapper.setMapping(&fActionZoomOut, -1);
@@ -202,6 +206,23 @@
     fListWidget.setCurrentRow(0);
 }
 
+void SkDebuggerGUI::actionSave() {
+    QString filename;
+    filename.append(fPath);
+    filename.append("/");
+    filename.append(fDirectoryWidget.currentItem()->text());
+    saveToFile(filename);
+}
+
+void SkDebuggerGUI::actionSaveAs() {
+    QString filename = QFileDialog::getSaveFileName(this, "Save File", "",
+            "Skia Picture (*skp)");
+    if (!filename.endsWith(".skp", Qt::CaseInsensitive))
+        filename.append(".skp");
+    }
+    saveToFile(filename);
+}
+
 void SkDebuggerGUI::actionScale(float scaleFactor) {
     fSettingsWidget.setZoomText(scaleFactor);
 }
@@ -230,6 +251,15 @@
     }
 }
 
+void SkDebuggerGUI::saveToFile(QString filename) {
+    SkFILEWStream file(filename.toAscii());
+    SkPicture picture;
+    SkCanvas* canvas = picture.beginRecording(100,100);
+    fCanvasWidget.getCurrentDebugCanvas()->draw(canvas);
+    picture.endRecording();
+    picture.serialize(&file);
+}
+
 void SkDebuggerGUI::loadFile(QListWidgetItem *item) {
     if (fDirectoryWidgetActive) {
         QString fileName;
@@ -406,6 +436,13 @@
     fActionRewind.setIcon(rewind);
     fActionRewind.setText("Rewind");
 
+    fActionSave.setShortcut(QKeySequence::Save);
+    fActionSave.setText("Save");
+    fActionSave.setDisabled(true);
+    fActionSaveAs.setShortcut(QKeySequence::SaveAs);
+    fActionSaveAs.setText("Save As");
+    fActionSaveAs.setDisabled(true);
+
     fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
     fActionShowDeletes.setText("Deleted Commands");
 
@@ -472,8 +509,7 @@
     fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
     SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
 
-    QWidget *spacer = new QWidget();
-    spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    fSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
     fToolBar.addAction(&fActionRewind);
     fToolBar.addAction(&fActionStepBack);
@@ -483,7 +519,7 @@
     fToolBar.addSeparator();
     fToolBar.addAction(&fActionInspector);
     fToolBar.addSeparator();
-    fToolBar.addWidget(spacer);
+    fToolBar.addWidget(&fSpacer);
     fToolBar.addWidget(&fFilter);
     fToolBar.addAction(&fActionCancel);
 
@@ -496,6 +532,8 @@
     // Menu Bar
     fMenuFile.setTitle("File");
     fMenuFile.addAction(&fActionOpen);
+    fMenuFile.addAction(&fActionSave);
+    fMenuFile.addAction(&fActionSaveAs);
     fMenuFile.addAction(&fActionClose);
 
     fMenuEdit.setTitle("Edit");
@@ -563,6 +601,8 @@
     fMenuEdit.setDisabled(false);
     fMenuNavigate.setDisabled(false);
     fMenuView.setDisabled(false);
+    fActionSave.setDisabled(false);
+    fActionSaveAs.setDisabled(false);
     fLoading = false;
     actionPlay();
 }