Save to image fix (ticket:96)
authorBrandon King <kingb@caltech.edu>
Fri, 13 Oct 2006 22:07:18 +0000 (22:07 +0000)
committerBrandon King <kingb@caltech.edu>
Fri, 13 Oct 2006 22:07:18 +0000 (22:07 +0000)
  * ImageSaveDialog now uses a SequenceBrowser copy contructor to draw the image.

  * glseqbrowser copy constructor was missing path_segments.

  * SequenceBrowser now has a copy constructor.

  * ImageSaveDialog needed to updated to use the bp per pixel zoom magnification;
meaning that when the user wants an image twice the x value of the glcanvas,
then the bps per pixel needed to halved.

  * bp_per_pixel2 = ( x_1 / x_2) * bp_per_pixel_1

alg/glseqbrowser.cpp
qui/ImageSaveDialog.cpp
qui/ImageSaveDialog.hpp
qui/seqbrowser/SequenceBrowser.cpp
qui/seqbrowser/SequenceBrowser.hpp
qui/seqbrowser/SequenceBrowserWidget.cpp

index 3342042755d16ca411a5ea5bce39e4657342c57a..61f42ab81fc78bd7b8920d8a0a1a188fe9b04986 100644 (file)
@@ -26,7 +26,8 @@ GlSeqBrowser::GlSeqBrowser(const GlSeqBrowser& gt)
     viewport_center(gt.viewport_center),
     zoom_level(gt.zoom_level),
     color_mapper(gt.color_mapper),
-    track_container(gt.track_container)
+    track_container(gt.track_container),
+    path_segments(gt.path_segments)
 {
 }
 
index 3a0a63f36fa3cb0f297a86d1813e3c0ae3a0b0d0..3248e3a9bdeaf870f6315ace5e786154d5c7a071 100644 (file)
@@ -7,6 +7,12 @@
 #include <QPushButton>
 #include <QGLWidget>
 
+// Win32 debug includes
+//#include <QMessageBox>
+//#include <sstream>
+//#include <string>
+//#include <QString>
+
 #include "ImageSaveDialog.hpp"
 #include "ImageScaler.hpp"
 
 namespace fs = boost::filesystem;
 
 ImageSaveDialog::ImageSaveDialog(boost::shared_ptr<QDir> default_dir_,
-                                 QGLWidget *newglwidget
-                                 QWidget *parent)
+                                ScrollableSequenceBrowser *scrollSeqBrowser
+                                QWidget *parent)
   : QDialog(parent),
+    glwidget(scrollSeqBrowser->browser(), parent),
     default_dir(default_dir_)
 {
   setWindowTitle(tr("Mussa Save Image"));
 
   // Init
-  glwidget = newglwidget;
+
   //pixmap = 0;
   imageScaler = new ImageScaler();
 
-  if (glwidget)
-  {
-    QSize tmpSize;
-    tmpSize = glwidget->size();
-    imageScaler->setWidth(tmpSize.width());
-    imageScaler->setHeight(tmpSize.height());
-  }
+  imageScaler->setWidth(static_cast<int>(glwidget.width()));
+  imageScaler->setHeight(static_cast<int>(glwidget.height()));
   
   // Save Button
   saveButton = new QPushButton(tr("Save"));
@@ -64,6 +66,7 @@ ImageSaveDialog::ImageSaveDialog(boost::shared_ptr<QDir> default_dir_,
   layout->addStretch(1);
   layout->addLayout(button_layout);
   setLayout(layout);
+
 }
 
 QDir ImageSaveDialog::defaultDir() const
@@ -106,14 +109,32 @@ QSize ImageSaveDialog::getOpenGlPixmapSize()
 
 QPixmap ImageSaveDialog::renderOpenGlPixmap()
 {
-  if (!glwidget)
-    return QPixmap();
-
-  
   QSize size = getOpenGlPixmapSize();
   if (size.isValid()) 
   {
-    QPixmap pixmap = glwidget->renderPixmap(size.width(), size.height());
+    double cur_bp_per_pixel = glwidget.zoom();
+    float cur_width = glwidget.width();
+    float cur_height = glwidget.height();
+    
+    // Useful debug code (in windows)... hopefully never to be used again. =o)
+    //QString msg = "Zoom:   " + QString().setNum(cur_bp_per_pixel) + "\n" + 
+    //  "Width:  " + QString().setNum(cur_width) + "\n" +
+    //  "Height: " + QString().setNum(cur_height) + "\n";
+    //
+    //QMessageBox::information(this, "Debug2", 
+    //                      msg );
+    //
+
+    // When the width requested by the user is doubled, the 
+    // bp per pixel is halved in order to scale the image properly.
+    double new_bp_per_pixel = ( cur_width / size.width() ) * cur_bp_per_pixel;
+
+    // bp per pixel needs to be scaled based when the width changes
+    glwidget.setZoom(new_bp_per_pixel);
+
+    // draw pixmp
+    QPixmap pixmap = glwidget.renderPixmap(size.width(), size.height());
+
     return pixmap;    
   }
   return QPixmap();
index 637e85f42b48c53b08831bc77dfd90fb15111d48..399fd8679c3c90c86e0c0d4d100694014df8fe6b 100644 (file)
@@ -6,6 +6,10 @@
 #include <QDialog>
 #include <QDir>
 
+#include "qui/seqbrowser/SequenceBrowser.hpp"
+#include "qui/seqbrowser/SequenceBrowserWidget.hpp"
+#include "qui/seqbrowser/ScrollableSequenceBrowser.hpp"
+
 class ImageScaler;
 class QLabel;
 class QPixmap;
@@ -17,7 +21,9 @@ class ImageSaveDialog : public QDialog
   Q_OBJECT
 
 public:
-  ImageSaveDialog(boost::shared_ptr<QDir> default_dir_, QGLWidget *qlwidget = 0, QWidget *parent = 0);
+  ImageSaveDialog(boost::shared_ptr<QDir> default_dir_, 
+                 ScrollableSequenceBrowser *scrollSeqBrowser = 0,
+                 QWidget *parent = 0);
   QDir defaultDir() const;
   
 public slots:
@@ -39,7 +45,8 @@ private:
   ImageScaler *imageScaler;
   QPushButton *saveButton;
   QPushButton *cancelButton;
-  QGLWidget *glwidget;  
+
+  SequenceBrowser glwidget;
 };
 
 #endif 
index fbfc124d3d33fbb5e96d36172f12930dee19c055..d781a3333888fe2250e30280f2cfa3f554214a6d 100644 (file)
@@ -29,6 +29,18 @@ SequenceBrowser::SequenceBrowser(QWidget *parent)
   popupMenu->addAction(copySelectedSequenceAsFastaAction);
 }
 
+SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
+  : QGLWidget(parent),
+    GlSeqBrowser(sb),
+    rubberBand(sb.rubberBand),
+    popupMenu(sb.popupMenu),
+    copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction)
+{
+  resize(sb.width(), sb.height());
+  setZoom(sb.zoom());
+  paintGL();
+}
+
 QMenu *SequenceBrowser::getPopupMenu()
 {
   return popupMenu;
index 8d1ef65a0c611ba90076b5b54d1c7c481db7cb94..0ef3155d393b386abca0b446ad27c09392c8c3b4 100644 (file)
@@ -27,6 +27,7 @@ class SequenceBrowser: public QGLWidget, public GlSeqBrowser
 
 public: 
   SequenceBrowser(QWidget *parent=0);
+  SequenceBrowser(const SequenceBrowser&, QWidget *parent=0);
 
   QSize sizeHint() const;
   void clear();
index 6a452fa00808840689a4d92e95cc85361b612c78..3b355fdfa17441d3c53f330d21e0ff867a0f5ba8 100644 (file)
@@ -185,7 +185,7 @@ void SequenceBrowserWidget::promptSaveBrowserPixmap()
   QSize size;
   size = scrollable_browser.browser().size();
   //Image Save Dialog
-  ImageSaveDialog imageSaveDialog(default_dir, &scrollable_browser.browser(), this);
+  ImageSaveDialog imageSaveDialog(default_dir, &scrollable_browser, this);
   imageSaveDialog.setSize(size.width(), size.height());
   imageSaveDialog.exec();
 }