X-Git-Url: http://woldlab.caltech.edu/gitweb/?a=blobdiff_plain;f=qui%2Fseqbrowser%2FSequenceBrowserWidget.cpp;h=34c7a9a14067f690eb35b82967726c6d7890232e;hb=02fc4144044a430f8bee6617c0c9871d4ebe5e4d;hp=ddc2d5c57fc200bcc50792803a441b72e4efa3ac;hpb=dd53c863d1851458c91b626954e74dcc6bff7736;p=mussa.git diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index ddc2d5c..34c7a9a 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -18,93 +18,165 @@ #include using namespace std; +SequenceBrowserWidget::SequenceBrowserWidget( + QWidget *parent) + : QScrollArea(parent), + left_sidebar(0), + scrollable_browser(0), + right_sidebar(0), + layout(0), + layout_container(0) +{ + boost::shared_ptr empty_dir(new QDir); + default_dir = empty_dir; + + init(); +} + SequenceBrowserWidget::SequenceBrowserWidget( boost::shared_ptr default_dir_, QWidget *parent ) - : QWidget(parent), - default_dir(default_dir_), - scrollable_browser(this) + : QScrollArea(parent), + left_sidebar(0), + scrollable_browser(0), + right_sidebar(0), + layout(0), + layout_container(0) { - QHBoxLayout *hlayout = new QHBoxLayout; - hlayout->addWidget(&left_sidebar, 0); - hlayout->addWidget(&scrollable_browser, 1); - hlayout->addWidget(&right_sidebar, 0); - setLayout(hlayout); + default_dir = default_dir_; + init(); +} + +void SequenceBrowserWidget::init() +{ + layout_container = new QWidget(this); + layout = new QHBoxLayout(layout_container); + left_sidebar = new SequenceBrowserSidebar(layout_container); + scrollable_browser = new ScrollableSequenceBrowser(layout_container); + right_sidebar = new SequenceBrowserSidebar(layout_container); + + layout->addWidget(left_sidebar, 0); + layout->addWidget(scrollable_browser, 1); + layout->addWidget(right_sidebar, 0); + + layout_container->setLayout(layout); + setWidget(layout_container); + setWidgetResizable(true); + // 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))); + + // Send the signal mouseWheelZoom signal from seq browser upward. + connect(&(scrollable_browser->browser()), SIGNAL(mouseWheelZoom(double)), + this, SIGNAL(mouseWheelZoom(double))); +} + + +SequenceBrowserWidget::SequenceBrowserWidget(const SequenceBrowserWidget &o) + : QScrollArea(o.window()), + left_sidebar(o.left_sidebar), + scrollable_browser(o.scrollable_browser), + right_sidebar(o.right_sidebar), + layout(o.layout), + layout_container(o.layout_container) +{ +} + +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(); +} + +QAction *SequenceBrowserWidget::getEditSequencePropertiesAction() +{ + return scrollable_browser->browser().getEditSequencePropertiesAction(); } 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) + const std::vector& new_sequences, + AnnotationColorsRef 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(); + for(Mussa::vector_sequence_type::const_iterator seq_i = new_sequences.begin(); + seq_i != new_sequences.end(); ++seq_i) { + // Blech *(*seq_i) is dereferencing the shared_ptr stored in the iterator. boost::shared_ptr gs(new GlSequence(*seq_i, cm)); 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; - for(size_t i = 0; i != sequences.size() and i != right.size(); ++i) + SequenceBrowserSidebar::collection left = left_sidebar->descriptions; + SequenceBrowserSidebar::collection right = right_sidebar->descriptions; + for(size_t i = 0; i != new_sequences.size() and i != right.size(); ++i) { connect(left[i], SIGNAL(nameChanged(const QString &)), right[i], SLOT(setName(const QString &))); @@ -119,7 +191,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 +199,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 +245,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(); }