From db983dc495ba2397136e21b62c5dd9b70c25cae6 Mon Sep 17 00:00:00 2001 From: Diane Trout Date: Thu, 26 Oct 2006 20:39:54 +0000 Subject: [PATCH] display number of basepairs copied ticket:211 this also provides a quick and dirty way of counting number of base pairs. --- alg/glseqbrowser.cpp | 24 ++++++++++++++---------- alg/glseqbrowser.hpp | 16 +++++++++++----- alg/sequence_location.cpp | 9 +++++++-- alg/sequence_location.hpp | 8 ++++++-- qui/MussaAlignedWindow.cpp | 11 +++++++++++ qui/MussaAlignedWindow.hpp | 2 ++ qui/MussaWindow.cpp | 12 ++++++++++++ qui/MussaWindow.hpp | 3 +++ qui/seqbrowser/SequenceBrowser.cpp | 3 ++- qui/seqbrowser/SequenceBrowser.hpp | 2 ++ qui/seqbrowser/SequenceBrowserWidget.cpp | 2 ++ qui/seqbrowser/SequenceBrowserWidget.hpp | 6 +++++- 12 files changed, 77 insertions(+), 21 deletions(-) diff --git a/alg/glseqbrowser.cpp b/alg/glseqbrowser.cpp index 61f42ab..396d068 100644 --- a/alg/glseqbrowser.cpp +++ b/alg/glseqbrowser.cpp @@ -451,11 +451,12 @@ list GlSeqBrowser::selectedTracks() const //! copy sequence from selected track using formating function template -void GlSeqBrowser::copySelectedTracks(std::list& result, +size_t GlSeqBrowser::copySelectedTracks(std::list& result, Item (*formatter)(boost::shared_ptr s, int left, int right)) { + size_t base_pairs_copied = 0; result.clear(); for(selected_track_iterator track_i = selected_tracks.begin(); @@ -471,12 +472,14 @@ void GlSeqBrowser::copySelectedTracks(std::list& result, // we should be safe boost::shared_ptr seq = track_container[track_index]->sequence(); result.push_back(formatter(seq, track_i->left, track_i->right)); + base_pairs_copied += max(track_i->right-track_i->left, 0); } } + return base_pairs_copied; } //! copy sequence from selected tracks as FASTA sequences -void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer) +size_t GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer) { std::list result; struct AsFasta { @@ -492,7 +495,7 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer) return s.str(); } }; - copySelectedTracks(result, AsFasta::formatter); + size_t base_pairs_copied = copySelectedTracks(result, AsFasta::formatter); // I wish there was some way to use for_each and bind here for (list::iterator result_i = result.begin(); result_i != result.end(); @@ -500,10 +503,11 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer) { copy_buffer.append(*result_i); } + return base_pairs_copied; } //! copy sequence from selected tracks as new sequences -void GlSeqBrowser::copySelectedTracksAsSequences(std::list& result) +size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list& result) { struct AsSequence { static Sequence formatter(boost::shared_ptr seq, @@ -513,10 +517,10 @@ void GlSeqBrowser::copySelectedTracksAsSequences(std::list& result) return seq->subseq(left, right-left+1); } }; - copySelectedTracks(result, AsSequence::formatter); + return copySelectedTracks(result, AsSequence::formatter); } -void GlSeqBrowser::copySelectedTracksAsSeqLocation( +size_t GlSeqBrowser::copySelectedTracksAsSeqLocation( std::list& result) { struct AsSeqLocation { @@ -527,11 +531,11 @@ void GlSeqBrowser::copySelectedTracksAsSeqLocation( return SequenceLocation(seq, left, right); } }; - copySelectedTracks(result, AsSeqLocation::formatter); + return copySelectedTracks(result, AsSeqLocation::formatter); } //! copy sequence from selected tracks as plain sequences -void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer) +size_t GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer) { std::list result; struct AsString { @@ -545,7 +549,7 @@ void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer) } }; - copySelectedTracks(result, AsString::formatter); + size_t base_pairs_copied = copySelectedTracks(result, AsString::formatter); // I wish there was some way to use for_each and bind here for (list::iterator result_i = result.begin(); result_i != result.end(); @@ -553,7 +557,7 @@ void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer) { copy_buffer.append(*result_i); } - + return base_pairs_copied; } void GlSeqBrowser::centerOnPath(const vector& paths) diff --git a/alg/glseqbrowser.hpp b/alg/glseqbrowser.hpp index 40f158b..2b313f6 100644 --- a/alg/glseqbrowser.hpp +++ b/alg/glseqbrowser.hpp @@ -99,19 +99,25 @@ public: //! copy sequence from selected track using formating function template - void copySelectedTracks(std::list& result, + size_t copySelectedTracks(std::list& result, Item (*format_track)(boost::shared_ptr s, int left, int right)); //! copy sequence from selected tracks as FASTA sequences - void copySelectedTracksAsFasta(std::string& copy_buffer); + /*! \return number of base pairs copied + */ + size_t copySelectedTracksAsFasta(std::string& copy_buffer); //! copy sequence from selected tracks as a list of sequences - void copySelectedTracksAsSequences(std::list& result); + /*! \return number of base pairs copied + */ + size_t copySelectedTracksAsSequences(std::list& result); //! copy sequence from selected tracks as plain sequences - void copySelectedTracksAsString(std::string& copy_buffer); + /*! \return number of base pairs copied + */ + size_t copySelectedTracksAsString(std::string& copy_buffer); //! copy tracks as a sequence and its coordinates - void copySelectedTracksAsSeqLocation(std::list& result); + size_t copySelectedTracksAsSeqLocation(std::list& result); //! Provide a logical name for a type discriminator for our glName stack diff --git a/alg/sequence_location.cpp b/alg/sequence_location.cpp index cbce781..32fd0ae 100644 --- a/alg/sequence_location.cpp +++ b/alg/sequence_location.cpp @@ -62,12 +62,12 @@ int SequenceLocation::getLeft() const return left; } -void SequenceLocation::setCount(int c) +void SequenceLocation::setCount(SequenceLocation::size_type c) { right = left + c; } -int SequenceLocation::getCount() const +SequenceLocation::size_type SequenceLocation::getCount() const { return std::max(right - left, 0); } @@ -81,3 +81,8 @@ int SequenceLocation::getRight() const { return right; } + +SequenceLocation::size_type SequenceLocation::size() const +{ + return getCount(); +} \ No newline at end of file diff --git a/alg/sequence_location.hpp b/alg/sequence_location.hpp index 3aca443..b8c6e9c 100644 --- a/alg/sequence_location.hpp +++ b/alg/sequence_location.hpp @@ -7,6 +7,8 @@ //! convenience structure for holding selected track segments class SequenceLocation { public: + typedef size_t size_type; + SequenceLocation(boost::shared_ptr s, int l, int r); SequenceLocation(const Sequence& s, int l, int r); SequenceLocation(const SequenceLocation& ); @@ -18,12 +20,14 @@ class SequenceLocation { Sequence getSelectedSequence() const; void setLeft(int l); int getLeft() const; - void setCount(int c); - int getCount() const ; + void setCount(size_type c); + size_type getCount() const; //! set one past the right-most base void setRight(int r); int getRight() const; + //! return total length of region (alias for getCount()) + size_type size() const; private: boost::shared_ptr sequence; int left; diff --git a/qui/MussaAlignedWindow.cpp b/qui/MussaAlignedWindow.cpp index 92b96eb..5498344 100644 --- a/qui/MussaAlignedWindow.cpp +++ b/qui/MussaAlignedWindow.cpp @@ -29,6 +29,8 @@ MussaAlignedWindow::MussaAlignedWindow(MussaRef m, alignTB(0) { setupActions(); + connect(&browser, SIGNAL(basepairsCopied(size_t)), + this, SLOT(showBasePairsCopied(size_t))); browser.setSequences(analysis->sequences(), analysis->colorMapper()); setSelectedPaths(analysis, sel_paths); setAlignment(0); @@ -190,6 +192,15 @@ void MussaAlignedWindow::setAlignment(int alignment_index) } } +void MussaAlignedWindow::showBasePairsCopied(size_t bp_copied) +{ + QString msg("Copied "); + QString num; + num.setNum(bp_copied); + msg += num + " base pairs"; + statusBar()->showMessage(msg, 5000); +} + void MussaAlignedWindow::toggleViewAlignment(int alignment_index) { view_paths[alignment_index]= not view_paths[alignment_index]; diff --git a/qui/MussaAlignedWindow.hpp b/qui/MussaAlignedWindow.hpp index f92e085..391ca54 100644 --- a/qui/MussaAlignedWindow.hpp +++ b/qui/MussaAlignedWindow.hpp @@ -47,6 +47,8 @@ public slots: //! set the title based on the analysis void updateTitle(); + //! display how many base pairs were copied on the status bar + void showBasePairsCopied(size_t); protected: // figure out what Alignments we have (needed for setupAlignmentMenus) diff --git a/qui/MussaWindow.cpp b/qui/MussaWindow.cpp index 1a7c355..b1b883a 100644 --- a/qui/MussaWindow.cpp +++ b/qui/MussaWindow.cpp @@ -74,6 +74,8 @@ MussaWindow::MussaWindow(MussaRef analysis_, QWidget *parent) : // to call update() connect(this, SIGNAL(changedAnnotations()), browser, SLOT(update())); connect(this, SIGNAL(changedMotifs()), this, SLOT(updateAnnotations())); + connect(browser, SIGNAL(basepairsCopied(size_t)), + this, SLOT(showBasePairsCopied(size_t))); //mussaViewTB->addAction(toggleMotifsAction); mussaViewTB->addWidget(zoom); @@ -615,6 +617,16 @@ void MussaWindow::showMussaToolbar() mussaViewTB->show(); } +void MussaWindow::showBasePairsCopied(size_t bp_copied) +{ + QString msg("Copied "); + QString num; + num.setNum(bp_copied); + msg += num + " base pairs"; + statusBar()->showMessage(msg, 5000); +} + + void MussaWindow::toggleMotifs() { NotImplementedBox(); diff --git a/qui/MussaWindow.hpp b/qui/MussaWindow.hpp index a36d1b9..efa3706 100644 --- a/qui/MussaWindow.hpp +++ b/qui/MussaWindow.hpp @@ -83,6 +83,9 @@ public slots: void newMussaWindow(); void showMussaToolbar(); + //! display how many base pairs were copied on the status bar + void showBasePairsCopied(size_t); + //! open new window showing our alignment void viewMussaAlignment(); diff --git a/qui/seqbrowser/SequenceBrowser.cpp b/qui/seqbrowser/SequenceBrowser.cpp index d781a33..7a8cd8f 100644 --- a/qui/seqbrowser/SequenceBrowser.cpp +++ b/qui/seqbrowser/SequenceBrowser.cpp @@ -101,11 +101,12 @@ void SequenceBrowser::copySelectedSequenceAsFasta() { // get fasta data std::string buffer; - copySelectedTracksAsFasta(buffer); + size_t base_pairs_copied = copySelectedTracksAsFasta(buffer); // get reference to clipboard QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(buffer.c_str()); + emit basepairsCopied(base_pairs_copied); } diff --git a/qui/seqbrowser/SequenceBrowser.hpp b/qui/seqbrowser/SequenceBrowser.hpp index 0ef3155..93589c4 100644 --- a/qui/seqbrowser/SequenceBrowser.hpp +++ b/qui/seqbrowser/SequenceBrowser.hpp @@ -52,6 +52,8 @@ signals: //! emited when someone adds to our list of tracks void tracksChanged(); void viewportChanged(); + //! emit when someone copies basepairs + void basepairsCopied(size_t); protected: void initializeGL(); diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index 3b355fd..35ce28e 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -35,6 +35,8 @@ SequenceBrowserWidget::SequenceBrowserWidget( // 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))); } void SequenceBrowserWidget::clear() diff --git a/qui/seqbrowser/SequenceBrowserWidget.hpp b/qui/seqbrowser/SequenceBrowserWidget.hpp index e8f75ad..de2fe67 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.hpp +++ b/qui/seqbrowser/SequenceBrowserWidget.hpp @@ -70,7 +70,11 @@ public slots: void promptSaveBrowserPixmap(); void update(); - + +signals: + //! emit when someone copies basepairs + void basepairsCopied(size_t); + private: boost::shared_ptr default_dir; ScrollableSequenceBrowser scrollable_browser; -- 2.30.2