From 97c29e658fd0be149674442a81337407e1d0ff73 Mon Sep 17 00:00:00 2001 From: Brandon King Date: Fri, 13 Oct 2006 22:07:18 +0000 Subject: [PATCH] Save to image fix (ticket:96) * 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 | 3 +- qui/ImageSaveDialog.cpp | 51 +++++++++++++++++------- qui/ImageSaveDialog.hpp | 11 ++++- qui/seqbrowser/SequenceBrowser.cpp | 12 ++++++ qui/seqbrowser/SequenceBrowser.hpp | 1 + qui/seqbrowser/SequenceBrowserWidget.cpp | 2 +- 6 files changed, 61 insertions(+), 19 deletions(-) diff --git a/alg/glseqbrowser.cpp b/alg/glseqbrowser.cpp index 3342042..61f42ab 100644 --- a/alg/glseqbrowser.cpp +++ b/alg/glseqbrowser.cpp @@ -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) { } diff --git a/qui/ImageSaveDialog.cpp b/qui/ImageSaveDialog.cpp index 3a0a63f..3248e3a 100644 --- a/qui/ImageSaveDialog.cpp +++ b/qui/ImageSaveDialog.cpp @@ -7,6 +7,12 @@ #include #include +// Win32 debug includes +//#include +//#include +//#include +//#include + #include "ImageSaveDialog.hpp" #include "ImageScaler.hpp" @@ -16,25 +22,21 @@ namespace fs = boost::filesystem; ImageSaveDialog::ImageSaveDialog(boost::shared_ptr 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(glwidget.width())); + imageScaler->setHeight(static_cast(glwidget.height())); // Save Button saveButton = new QPushButton(tr("Save")); @@ -64,6 +66,7 @@ ImageSaveDialog::ImageSaveDialog(boost::shared_ptr 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(); diff --git a/qui/ImageSaveDialog.hpp b/qui/ImageSaveDialog.hpp index 637e85f..399fd86 100644 --- a/qui/ImageSaveDialog.hpp +++ b/qui/ImageSaveDialog.hpp @@ -6,6 +6,10 @@ #include #include +#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 default_dir_, QGLWidget *qlwidget = 0, QWidget *parent = 0); + ImageSaveDialog(boost::shared_ptr 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 diff --git a/qui/seqbrowser/SequenceBrowser.cpp b/qui/seqbrowser/SequenceBrowser.cpp index fbfc124..d781a33 100644 --- a/qui/seqbrowser/SequenceBrowser.cpp +++ b/qui/seqbrowser/SequenceBrowser.cpp @@ -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; diff --git a/qui/seqbrowser/SequenceBrowser.hpp b/qui/seqbrowser/SequenceBrowser.hpp index 8d1ef65..0ef3155 100644 --- a/qui/seqbrowser/SequenceBrowser.hpp +++ b/qui/seqbrowser/SequenceBrowser.hpp @@ -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(); diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index 6a452fa..3b355fd 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -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(); } -- 2.30.2