display number of basepairs copied
authorDiane Trout <diane@caltech.edu>
Thu, 26 Oct 2006 20:39:54 +0000 (20:39 +0000)
committerDiane Trout <diane@caltech.edu>
Thu, 26 Oct 2006 20:39:54 +0000 (20:39 +0000)
ticket:211
this also provides a quick and dirty way of counting number of base pairs.

12 files changed:
alg/glseqbrowser.cpp
alg/glseqbrowser.hpp
alg/sequence_location.cpp
alg/sequence_location.hpp
qui/MussaAlignedWindow.cpp
qui/MussaAlignedWindow.hpp
qui/MussaWindow.cpp
qui/MussaWindow.hpp
qui/seqbrowser/SequenceBrowser.cpp
qui/seqbrowser/SequenceBrowser.hpp
qui/seqbrowser/SequenceBrowserWidget.cpp
qui/seqbrowser/SequenceBrowserWidget.hpp

index 61f42ab81fc78bd7b8920d8a0a1a188fe9b04986..396d06884898db35bed5d9c7cd14c1e1d477b4fd 100644 (file)
@@ -451,11 +451,12 @@ list<TrackRegion> GlSeqBrowser::selectedTracks() const
 
 //! copy sequence from selected track using formating function
 template<class Item>
-void GlSeqBrowser::copySelectedTracks(std::list<Item>& result, 
+size_t GlSeqBrowser::copySelectedTracks(std::list<Item>& result, 
              Item (*formatter)(boost::shared_ptr<Sequence> 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<Item>& result,
       // we should be safe
       boost::shared_ptr<Sequence> 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<std::string> 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<string>::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<Sequence>& result)
+size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
 {
   struct AsSequence {
     static Sequence formatter(boost::shared_ptr<Sequence> seq, 
@@ -513,10 +517,10 @@ void GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& 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<SequenceLocation>& 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<string> 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<string>::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<int>& paths)
index 40f158ba7b01467d49ca55e3d09c7244cd398c80..2b313f65e5fca7bcd62434118572ea6fc702555d 100644 (file)
@@ -99,19 +99,25 @@ public:
 
   //! copy sequence from selected track using formating function
   template<class Item>
-  void copySelectedTracks(std::list<Item>& result, 
+  size_t copySelectedTracks(std::list<Item>& result, 
              Item (*format_track)(boost::shared_ptr<Sequence> 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<Sequence>& result);
+  /*! \return number of base pairs copied
+   */
+  size_t copySelectedTracksAsSequences(std::list<Sequence>& 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<SequenceLocation>& result);
+  size_t copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& result);
   
   
   //! Provide a logical name for a type discriminator for our glName stack
index cbce781c520400949f1ea13ac37aad6d8e529a87..32fd0aedd4075e540b8aaacf05a34711d5ad7bf6 100644 (file)
@@ -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
index 3aca443b4164352817ff84e5edfb7e6abe6477e5..b8c6e9c4549dc9258585e25757e484029f61ac15 100644 (file)
@@ -7,6 +7,8 @@
 //! convenience structure for holding selected track segments
 class SequenceLocation {
   public:
+    typedef size_t size_type;
+    
     SequenceLocation(boost::shared_ptr<Sequence> 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> sequence;
     int left;
index 92b96eb9e538796409a1c53766c369d3cf1e38de..5498344a0bdf00ebd5da8da69168587b80ac17c4 100644 (file)
@@ -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]; 
index f92e0859b638a6964c29fb98509966e6960bce52..391ca54063aa168a82acfe6244911a625c3498d3 100644 (file)
@@ -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)
index 1a7c355dad75b3f9df71bdb26e16a0ab748612be..b1b883a2297359e26d3724b8c5b2cf81976c15ff 100644 (file)
@@ -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();
index a36d1b95ce4b8fa7eebf7ae141ba85b346c29671..efa370697ee82422b10e8a56630d219f72f2de75 100644 (file)
@@ -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();
index d781a3333888fe2250e30280f2cfa3f554214a6d..7a8cd8fb754a4a41257b93321046410815dff5c5 100644 (file)
@@ -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);
 }
 
 
index 0ef3155d393b386abca0b446ad27c09392c8c3b4..93589c404353d1ed53641077ede6d32c7eb751a2 100644 (file)
@@ -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();
index 3b355fdfa17441d3c53f330d21e0ff867a0f5ba8..35ce28e2c9d1df0f089677833abc8c4d8194c92a 100644 (file)
@@ -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()
index e8f75adc4689c3624207b985f4fea73788e73601..de2fe67eada22db59e475355c77dd32059e48acb 100644 (file)
@@ -70,7 +70,11 @@ public slots:
   void promptSaveBrowserPixmap();
 
   void update();
-
+  
+signals:
+  //! emit when someone copies basepairs
+  void basepairsCopied(size_t);
+  
 private:
   boost::shared_ptr<QDir> default_dir;
   ScrollableSequenceBrowser scrollable_browser;