X-Git-Url: http://woldlab.caltech.edu/gitweb/?a=blobdiff_plain;f=qui%2Fseqbrowser%2FSequenceBrowserWidget.cpp;h=34c7a9a14067f690eb35b82967726c6d7890232e;hb=02fc4144044a430f8bee6617c0c9871d4ebe5e4d;hp=dbfa4880d173fed76721ffceb6f846c3bea6c6ee;hpb=df8334ae12ac6887b15fb26e4701abde47331a67;p=mussa.git diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index dbfa488..34c7a9a 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -18,86 +18,219 @@ #include using namespace std; -SequenceBrowserWidget::SequenceBrowserWidget(QWidget *parent) - : QSplitter(parent), - scrollable_browser(parent) +SequenceBrowserWidget::SequenceBrowserWidget( + QWidget *parent) + : QScrollArea(parent), + left_sidebar(0), + scrollable_browser(0), + right_sidebar(0), + layout(0), + layout_container(0) { - setOrientation(Qt::Horizontal); + boost::shared_ptr empty_dir(new QDir); + default_dir = empty_dir; - addWidget(&left_sidebar); - addWidget(&scrollable_browser); - addWidget(&right_sidebar); + init(); +} + +SequenceBrowserWidget::SequenceBrowserWidget( + boost::shared_ptr default_dir_, + QWidget *parent +) + : QScrollArea(parent), + left_sidebar(0), + scrollable_browser(0), + right_sidebar(0), + layout(0), + layout_container(0) +{ + default_dir = default_dir_; - connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()), + 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()), this, SLOT(updatePosition())); + 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(); - left_sidebar.clear(); - right_sidebar.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) + { + 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(); +} + +QMenu *SequenceBrowserWidget::getPopupMenu() +{ + return scrollable_browser->browser().getPopupMenu(); +} + +QAction *SequenceBrowserWidget::getCopySelectedSequenceAsStringAction() +{ + return scrollable_browser->browser().getCopySelectedSequenceAsStringAction(); +} + +QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction() +{ + return scrollable_browser->browser().getCopySelectedSequenceAsFastaAction(); +} + +QAction *SequenceBrowserWidget::getEditSequencePropertiesAction() +{ + return scrollable_browser->browser().getEditSequencePropertiesAction(); +} + +void SequenceBrowserWidget::copySelectedSequenceAsFasta() +{ + scrollable_browser->browser().copySelectedSequenceAsFasta(); +} + +void SequenceBrowserWidget::copySelectedTracksAsSeqLocation( + std::list& locations +) +{ + scrollable_browser->browser().copySelectedTracksAsSeqLocation(locations); } -void SequenceBrowserWidget::setSequences(const std::vector& sequences, - AnnotationColors& cm) +void SequenceBrowserWidget::setSequences( + const std::vector& new_sequences, + AnnotationColorsRef cm) { - SequenceBrowser& browser = scrollable_browser.browser(); + SequenceBrowser& browser = scrollable_browser->browser(); clear(); - for(vector::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) { - GlSequence *gs= new GlSequence(*seq_i, cm); - converted_sequences.push_back(*gs); - browser.push_sequence(*gs); + // 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); + + // 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 != new_sequences.size() and i != right.size(); ++i) + { + connect(left[i], SIGNAL(nameChanged(const QString &)), + right[i], SLOT(setName(const QString &))); + connect(right[i], SIGNAL(nameChanged(const QString &)), + left[i], SLOT(setName(const QString &))); } - left_sidebar.setSequences(converted_sequences); - right_sidebar.setSequences(converted_sequences); + updatePosition(); } -void SequenceBrowserWidget::setSequences(std::vector& sequences) +void SequenceBrowserWidget::setSequences( + std::vector >& sequences +) { - SequenceBrowser& browser = scrollable_browser.browser(); + SequenceBrowser& browser = scrollable_browser->browser(); clear(); - for(vector::iterator seq_i = sequences.begin(); + for(vector >::iterator seq_i = sequences.begin(); seq_i != sequences.end(); ++seq_i) { 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 +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().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(); } /* This could theoretically be pushed down to some set @@ -112,47 +245,55 @@ void SequenceBrowserWidget::centerOnPath(const vector& paths) */ void SequenceBrowserWidget::updatePosition() { - const SequenceBrowser& browser = scrollable_browser.browser(); - const vector &sequences = browser.sequences(); - vector left = left_sidebar.descriptions; - vector right = right_sidebar.descriptions; + const SequenceBrowser& browser = scrollable_browser->browser(); + const vector > &sequences = browser.sequences(); + 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())); + left[i]->setPosition(sequences[i]->leftbase(browser.viewportLeft())); + right[i]->setPosition(sequences[i]->rightbase(browser.viewportRight())); } - 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(&scrollable_browser.browser(), this); + ImageSaveDialog imageSaveDialog(default_dir, scrollable_browser, this); imageSaveDialog.setSize(size.width(), size.height()); - int result = imageSaveDialog.exec(); - cout << "Result: " << result << "\n"; + imageSaveDialog.exec(); +} + +double SequenceBrowserWidget::zoom() +{ + return scrollable_browser->browser().zoom(); } -int SequenceBrowserWidget::zoom() +double SequenceBrowserWidget::zoomOut() { - return scrollable_browser.browser().zoom(); + double zoom_level = scrollable_browser->browser().zoomOut(); + scrollable_browser->updateScrollBar(); + return zoom_level; } -void SequenceBrowserWidget::zoomOut() +double SequenceBrowserWidget::zoomToSequence() { - scrollable_browser.browser().zoomOut(); - scrollable_browser.updateScrollBar(); + double zoom_level = scrollable_browser->browser().zoomToSequence(); + scrollable_browser->updateScrollBar(); + return zoom_level; } -void SequenceBrowserWidget::zoomToSequence() +void SequenceBrowserWidget::setZoom(double z) { - scrollable_browser.browser().zoomToSequence(); - scrollable_browser.updateScrollBar(); + scrollable_browser->browser().setZoom(z); } -void SequenceBrowserWidget::setZoom(int z) +void SequenceBrowserWidget::update() { - scrollable_browser.browser().setZoom(z); + QWidget::update(); + scrollable_browser->browser().update(); }