From: Diane Trout Date: Sat, 28 Oct 2006 01:40:35 +0000 (+0000) Subject: compute the correct starting window size X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=mussa.git;a=commitdiff_plain;h=2b80bb5d34ddbc31b466a102df6410307a96a016 compute the correct starting window size ticket:233 try to compute a window size that will show the tracks as the gl canvas decided to draw them. --- diff --git a/alg/glseqbrowser.cpp b/alg/glseqbrowser.cpp index 7238f15..5d93c6c 100644 --- a/alg/glseqbrowser.cpp +++ b/alg/glseqbrowser.cpp @@ -265,6 +265,16 @@ float GlSeqBrowser::viewportWidth() const return cur_ortho.right - cur_ortho.left; } +int GlSeqBrowser::viewportPixelHeight() const +{ + return viewport_size.y; +} + +int GlSeqBrowser::viewportPixelWidth() const +{ + return viewport_size.x; +} + double GlSeqBrowser::zoomOut() { diff --git a/alg/glseqbrowser.hpp b/alg/glseqbrowser.hpp index 2b313f6..5cc0672 100644 --- a/alg/glseqbrowser.hpp +++ b/alg/glseqbrowser.hpp @@ -50,6 +50,11 @@ public: float viewportHeight() const; //! return width of the viewport in world coordinates float viewportWidth() const; + + //! return viewport height in pixels + int viewportPixelHeight() const; + //! return viewport width in pixels + int viewportPixelWidth() const; //! zoom out far enough to show the full size of the sequence double zoomOut(); diff --git a/qui/seqbrowser/SequenceBrowser.cpp b/qui/seqbrowser/SequenceBrowser.cpp index a74ee78..99fbea7 100644 --- a/qui/seqbrowser/SequenceBrowser.cpp +++ b/qui/seqbrowser/SequenceBrowser.cpp @@ -62,8 +62,7 @@ QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction() QSize SequenceBrowser::sizeHint() const { - //return QSize((int)GlSeqBrowser::viewportHeight(), (int)GlSeqBrowser::viewportWidth()); - return QSize(600, 400); + return QSize(viewportPixelWidth(), viewportPixelHeight()); } void SequenceBrowser::setViewportCenter(float x) diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index ddc2d5c..f0f0b44 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -24,71 +24,93 @@ SequenceBrowserWidget::SequenceBrowserWidget( ) : QWidget(parent), default_dir(default_dir_), - scrollable_browser(this) + left_sidebar(new SequenceBrowserSidebar), + scrollable_browser(new ScrollableSequenceBrowser), + right_sidebar(new SequenceBrowserSidebar), + layout(new QHBoxLayout) { - QHBoxLayout *hlayout = new QHBoxLayout; - hlayout->addWidget(&left_sidebar, 0); - hlayout->addWidget(&scrollable_browser, 1); - hlayout->addWidget(&right_sidebar, 0); - setLayout(hlayout); + layout->addWidget(left_sidebar, 0); + layout->addWidget(scrollable_browser, 1); + layout->addWidget(right_sidebar, 0); + + setLayout(layout); // update position values when something in the SequenceBrowser changes - connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()), + connect(&(scrollable_browser->browser()), SIGNAL(viewportChanged()), this, SLOT(updatePosition())); - connect(&scrollable_browser.browser(), SIGNAL(basepairsCopied(size_t)), + connect(&(scrollable_browser->browser()), SIGNAL(basepairsCopied(size_t)), this, SIGNAL(basepairsCopied(size_t))); } +QSize SequenceBrowserWidget::sizeHint() const +{ + // don't trust the layouts size computation + // use some heavy handed brute force to compute + // the correct size so our stupid scrollable_browser + // will show the full viewport. + QSize left = left_sidebar->sizeHint(); + QSize center = scrollable_browser->sizeHint(); + QSize right = right_sidebar->sizeHint(); + + int width = left.width()+center.width()+right.width(); + width += 2 * layout->margin(); + if (layout->spacing() > 0) { + width += layout->spacing() * 3; + } + return QSize(width, center.height()); +} + + void SequenceBrowserWidget::clear() { converted_sequences.clear(); - scrollable_browser.browser().clear(); + scrollable_browser->browser().clear(); - SequenceBrowserSidebar::collection left = left_sidebar.descriptions; - SequenceBrowserSidebar::collection right = right_sidebar.descriptions; - for(size_t i = 0; i != left_sidebar.size(); ++i) + SequenceBrowserSidebar::collection left = left_sidebar->descriptions; + SequenceBrowserSidebar::collection right = right_sidebar->descriptions; + for(size_t i = 0; i != left_sidebar->size(); ++i) { disconnect(left[i], SIGNAL(nameChanged(const QString &)), right[i], SLOT(setName(const QString &))); disconnect(right[i], SIGNAL(nameChanged(const QString &)), left[i], SLOT(setName(const QString &))); } - left_sidebar.clear(); - right_sidebar.clear(); + left_sidebar->clear(); + right_sidebar->clear(); } QMenu *SequenceBrowserWidget::getPopupMenu() { - return scrollable_browser.browser().getPopupMenu(); + return scrollable_browser->browser().getPopupMenu(); } QAction *SequenceBrowserWidget::getCopySelectedSequenceAsStringAction() { - return scrollable_browser.browser().getCopySelectedSequenceAsStringAction(); + return scrollable_browser->browser().getCopySelectedSequenceAsStringAction(); } QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction() { - return scrollable_browser.browser().getCopySelectedSequenceAsFastaAction(); + return scrollable_browser->browser().getCopySelectedSequenceAsFastaAction(); } void SequenceBrowserWidget::copySelectedSequenceAsFasta() { - scrollable_browser.browser().copySelectedSequenceAsFasta(); + scrollable_browser->browser().copySelectedSequenceAsFasta(); } void SequenceBrowserWidget::copySelectedTracksAsSeqLocation( std::list& locations ) { - scrollable_browser.browser().copySelectedTracksAsSeqLocation(locations); + scrollable_browser->browser().copySelectedTracksAsSeqLocation(locations); } void SequenceBrowserWidget::setSequences( const std::vector >& sequences, boost::shared_ptr cm) { - SequenceBrowser& browser = scrollable_browser.browser(); + SequenceBrowser& browser = scrollable_browser->browser(); clear(); for(Mussa::vector_sequence_type::const_iterator seq_i = sequences.begin(); seq_i != sequences.end(); @@ -98,12 +120,12 @@ void SequenceBrowserWidget::setSequences( converted_sequences.push_back(gs); browser.push_sequence(gs); } - left_sidebar.setSequences(converted_sequences); - right_sidebar.setSequences(converted_sequences); + left_sidebar->setSequences(converted_sequences); + right_sidebar->setSequences(converted_sequences); // connect the text change signals to each other - SequenceBrowserSidebar::collection left = left_sidebar.descriptions; - SequenceBrowserSidebar::collection right = right_sidebar.descriptions; + SequenceBrowserSidebar::collection left = left_sidebar->descriptions; + SequenceBrowserSidebar::collection right = right_sidebar->descriptions; for(size_t i = 0; i != sequences.size() and i != right.size(); ++i) { connect(left[i], SIGNAL(nameChanged(const QString &)), @@ -119,7 +141,7 @@ void SequenceBrowserWidget::setSequences( std::vector >& sequences ) { - SequenceBrowser& browser = scrollable_browser.browser(); + SequenceBrowser& browser = scrollable_browser->browser(); clear(); for(vector >::iterator seq_i = sequences.begin(); seq_i != sequences.end(); @@ -127,37 +149,37 @@ void SequenceBrowserWidget::setSequences( { browser.push_sequence(*seq_i); } - left_sidebar.setSequences(sequences); - right_sidebar.setSequences(sequences); + left_sidebar->setSequences(sequences); + right_sidebar->setSequences(sequences); updatePosition(); } const vector >& SequenceBrowserWidget::sequences() const { - return scrollable_browser.browser().sequences(); + return scrollable_browser->browser().sequences(); } void SequenceBrowserWidget::clear_links() { - scrollable_browser.browser().clear_links(); + scrollable_browser->browser().clear_links(); } void SequenceBrowserWidget::link(const std::vector& path, const std::vector& isRC, int length) { - scrollable_browser.browser().link(path, isRC, length); - scrollable_browser.browser().update(); + scrollable_browser->browser().link(path, isRC, length); + scrollable_browser->browser().update(); } const std::set SequenceBrowserWidget::selectedPaths() const { - return scrollable_browser.browser().selectedPaths(); + return scrollable_browser->browser().selectedPaths(); } void SequenceBrowserWidget::centerOnPath(const vector& paths) { - scrollable_browser.browser().centerOnPath(paths); + scrollable_browser->browser().centerOnPath(paths); updatePosition(); } @@ -173,55 +195,55 @@ void SequenceBrowserWidget::centerOnPath(const vector& paths) */ void SequenceBrowserWidget::updatePosition() { - const SequenceBrowser& browser = scrollable_browser.browser(); + const SequenceBrowser& browser = scrollable_browser->browser(); const vector > &sequences = browser.sequences(); - SequenceBrowserSidebar::collection left = left_sidebar.descriptions; - SequenceBrowserSidebar::collection right = right_sidebar.descriptions; + SequenceBrowserSidebar::collection left = left_sidebar->descriptions; + SequenceBrowserSidebar::collection right = right_sidebar->descriptions; for(size_t i = 0; i != sequences.size() and i != right.size(); ++i) { left[i]->setPosition(sequences[i]->leftbase(browser.viewportLeft())); right[i]->setPosition(sequences[i]->rightbase(browser.viewportRight())); } - scrollable_browser.browser().update(); - scrollable_browser.updateScrollBar(); + scrollable_browser->browser().update(); + scrollable_browser->updateScrollBar(); } void SequenceBrowserWidget::promptSaveBrowserPixmap() { QSize size; - size = scrollable_browser.browser().size(); + size = scrollable_browser->browser().size(); //Image Save Dialog - ImageSaveDialog imageSaveDialog(default_dir, &scrollable_browser, this); + ImageSaveDialog imageSaveDialog(default_dir, scrollable_browser, this); imageSaveDialog.setSize(size.width(), size.height()); imageSaveDialog.exec(); } double SequenceBrowserWidget::zoom() { - return scrollable_browser.browser().zoom(); + return scrollable_browser->browser().zoom(); } double SequenceBrowserWidget::zoomOut() { - double zoom_level = scrollable_browser.browser().zoomOut(); - scrollable_browser.updateScrollBar(); + double zoom_level = scrollable_browser->browser().zoomOut(); + scrollable_browser->updateScrollBar(); return zoom_level; } double SequenceBrowserWidget::zoomToSequence() { - double zoom_level = scrollable_browser.browser().zoomToSequence(); - scrollable_browser.updateScrollBar(); + double zoom_level = scrollable_browser->browser().zoomToSequence(); + scrollable_browser->updateScrollBar(); return zoom_level; } void SequenceBrowserWidget::setZoom(double z) { - scrollable_browser.browser().setZoom(z); + scrollable_browser->browser().setZoom(z); } void SequenceBrowserWidget::update() { QWidget::update(); - scrollable_browser.browser().update(); + scrollable_browser->browser().update(); } diff --git a/qui/seqbrowser/SequenceBrowserWidget.hpp b/qui/seqbrowser/SequenceBrowserWidget.hpp index 48bb089..3527e20 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.hpp +++ b/qui/seqbrowser/SequenceBrowserWidget.hpp @@ -5,6 +5,8 @@ #include #include +#include +#include #include #include "alg/sequence.hpp" @@ -27,6 +29,8 @@ public: //! return our string copy action (reference stored internally) QAction *getCopySelectedSequenceAsStringAction(); + QSize sizeHint() const; + //! copy selected track regions into a list of SequenceLocations void copySelectedTracksAsSeqLocation(std::list& ); @@ -79,9 +83,10 @@ signals: private: boost::shared_ptr default_dir; - ScrollableSequenceBrowser scrollable_browser; - SequenceBrowserSidebar left_sidebar; - SequenceBrowserSidebar right_sidebar; + ScrollableSequenceBrowser *scrollable_browser; + SequenceBrowserSidebar *left_sidebar; + SequenceBrowserSidebar *right_sidebar; + QHBoxLayout *layout; //! sequences created by a setSequences(vector) call /*! I need to save them so i can free them to avoid a memory leak