Allow changing the name for a sequence in the sequence browser.
authorDiane Trout <diane@caltech.edu>
Wed, 23 Aug 2006 01:40:40 +0000 (01:40 +0000)
committerDiane Trout <diane@caltech.edu>
Wed, 23 Aug 2006 01:40:40 +0000 (01:40 +0000)
Doing this required being much more thorough about always using
boost::shared_ptr<>s for GlSequences and Sequences.

When you initalize a shared pointer from something that wasn't specially
allocated for it using new, bad things happen.

This is more of me learning that if one has a temptation to store a reference
don't. Instead use a shared_ptr or similar.

21 files changed:
alg/glseqbrowser.cpp
alg/glseqbrowser.hpp
alg/glsequence.cpp
alg/glsequence.hpp
alg/test/test_glseqbrowser.cpp
alg/test/test_glsequence.cpp
py/glsequence.cpp
qui/MussaWindow.cpp
qui/MussaWindow.hpp
qui/SubanalysisWindow.cpp
qui/seqbrowser/SequenceBrowser.cpp
qui/seqbrowser/SequenceBrowser.hpp
qui/seqbrowser/SequenceBrowserSidebar.cpp
qui/seqbrowser/SequenceBrowserSidebar.hpp
qui/seqbrowser/SequenceBrowserWidget.cpp
qui/seqbrowser/SequenceBrowserWidget.hpp
qui/seqbrowser/SequenceDescription.cpp
qui/seqbrowser/SequenceDescription.hpp
qui/test/CMakeLists.txt
qui/test/TestSequenceBrowser.cpp
qui/test/TestSequenceDescription.cpp [new file with mode: 0644]

index 470c7c437cf1cdac1adc6c4900857e36f63dfac1..254b845915233d48e2734e59ce6a88aef4d49128 100644 (file)
@@ -117,8 +117,8 @@ void GlSeqBrowser::processSelection(GLuint hits, GLuint buffer[], GLuint bufsize
         {
           objid = *ptr++; ++consumed_names;
 
-          int left = track_container[objid].leftbase(r.left);
-          int right = track_container[objid].rightbase(r.right);
+          int left = track_container[objid]->leftbase(r.left);
+          int right = track_container[objid]->rightbase(r.right);
           // the static_cast should be ok, since basepairs line up on 
           // integral values
           //TrackRegion track(objid, left, right); 
@@ -193,12 +193,12 @@ float GlSeqBrowser::left() const
   {
     return cur_ortho.left;
   } else {
-    vector<GlSequence>::const_iterator track_i = track_container.begin();    
-    left = track_i->x();
+    vector<boost::shared_ptr<GlSequence> >::const_iterator track_i = track_container.begin();    
+    left = (*track_i)->x();
     for( ; track_i != track_container.end(); ++track_i)
     {
-      if (track_i->x() < left) {
-        left = track_i->x();
+      if ((*track_i)->x() < left) {
+        left = (*track_i)->x();
       }
     }
     return left-border_width;
@@ -211,11 +211,11 @@ float GlSeqBrowser::right() const
   if (track_container.size() == 0) {
     return cur_ortho.right;
   } else {
-    vector<GlSequence>::const_iterator track_i = track_container.begin();
-    right = track_i->right();
+    vector<boost::shared_ptr<GlSequence> >::const_iterator track_i = track_container.begin();
+    right = (*track_i)->right();
     for( ; track_i != track_container.end(); ++track_i) {
-      if (track_i->right() > right)
-        right = track_i->right();
+      if ((*track_i)->right() > right)
+        right = (*track_i)->right();
     }
     return right+border_width;
   }
@@ -321,11 +321,17 @@ void GlSeqBrowser::push_sequence(const Sequence& s)
 
 void GlSeqBrowser::push_sequence(boost::shared_ptr<Sequence> s)
 {
-  GlSequence gs(s, color_mapper);
+  boost::shared_ptr<GlSequence> gs(new GlSequence(s, color_mapper));
   push_sequence(gs);
 }
 
 void GlSeqBrowser::push_sequence(GlSequence gs)
+{
+  boost::shared_ptr<GlSequence> new_gs(new GlSequence(gs));
+  push_sequence(new_gs);
+}
+
+void GlSeqBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
 {
   clear_links();
   track_container.push_back(gs);
@@ -334,7 +340,7 @@ void GlSeqBrowser::push_sequence(GlSequence gs)
     path_segments.push_back(pair_segment_map());
 }
 
-const std::vector<GlSequence>& GlSeqBrowser::sequences() const
+const std::vector<boost::shared_ptr<GlSequence> >& GlSeqBrowser::sequences() const
 {
   return track_container;
 }
@@ -376,10 +382,10 @@ GlSeqBrowser::link(const vector<int>& path, const vector<bool>& rc, int )
     pair_segment_map::iterator found_segment = path_segments[track_i].find(p);
     if (found_segment == path_segments[track_i].end()) {
       // not already found
-      float y1 = track_container[track_i].y();
-            y1 -= track_container[track_i].height()/2;
-      float y2 = track_container[track_i+1].y();
-            y2 += track_container[track_i+1].height()/2;
+      float y1 = track_container[track_i]->y();
+            y1 -= track_container[track_i]->height()/2;
+      float y2 = track_container[track_i+1]->y();
+            y2 += track_container[track_i+1]->height()/2;
       
       bool rcFlag = (prev_rc or *rc_i) and !(prev_rc and *rc_i);
       Segment s(prev_x, y1, *path_i, y2, rcFlag);
@@ -428,7 +434,9 @@ list<TrackRegion> GlSeqBrowser::selectedTracks() const
 //! copy sequence from selected track using formating function
 template<class Item>
 void GlSeqBrowser::copySelectedTracks(std::list<Item>& result, 
-             Item (*formatter)(const Sequence& s, int left, int right))
+             Item (*formatter)(boost::shared_ptr<Sequence> s, 
+                               int left, 
+                               int right))
 {
   result.clear();
 
@@ -443,7 +451,7 @@ void GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
            << endl;
     } else {
       // we should be safe
-      const Sequence& seq = track_container[track_index].sequence();
+      boost::shared_ptr<Sequence> seq = track_container[track_index]->sequence();
       result.push_back(formatter(seq, track_i->left, track_i->right));
     }
   }
@@ -454,13 +462,15 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
 {
   std::list<std::string> result;
   struct AsFasta {
-    static string formatter(const Sequence& seq, int left, int right)
+    static string formatter(boost::shared_ptr<Sequence> seq, 
+                            int left, 
+                            int right)
     {
       stringstream s;
-      s << ">" << seq.get_fasta_header() 
+      s << ">" << seq->get_fasta_header() 
         << "|" << "subregion=" << left << "-" << right+1
         << std::endl
-        << seq.subseq(left, right-left+1) << std::endl;
+        << seq->subseq(left, right-left+1) << std::endl;
       return s.str();
     }
   };
@@ -478,9 +488,11 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
 void GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
 {
   struct AsSequence {
-    static Sequence formatter(const Sequence& seq, int left, int right)
+    static Sequence formatter(boost::shared_ptr<Sequence> seq, 
+                              int left, 
+                              int right)
     {
-      return seq.subseq(left, right-left+1);
+      return seq->subseq(left, right-left+1);
     }
   };
   copySelectedTracks(result, AsSequence::formatter);
@@ -490,7 +502,9 @@ void GlSeqBrowser::copySelectedTracksAsSeqLocation(
     std::list<SequenceLocation>& result)
 {
   struct AsSeqLocation {
-    static SequenceLocation formatter(const Sequence& seq, int left, int right)
+    static SequenceLocation formatter(boost::shared_ptr<Sequence> seq, 
+                                      int left, 
+                                      int right)
     {
       return SequenceLocation(seq, left, right);
     }
@@ -503,10 +517,12 @@ void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
 {
   std::list<string> result;
   struct AsString {
-    static string formatter(const Sequence& seq, int left, int right)
+    static string formatter(boost::shared_ptr<Sequence> seq, 
+                            int left, 
+                            int right)
     {
       stringstream s;
-      s << seq.subseq(left, right-left+1) << std::endl;
+      s << seq->subseq(left, right-left+1) << std::endl;
       return s.str();
     }
   };
@@ -531,7 +547,7 @@ void GlSeqBrowser::centerOnPath(const vector<int>& paths)
   for(size_t track_i = 0; track_i != track_container.size(); ++track_i)
   {
     // -15 = shift more to the left
-    track_container[track_i].setX((viewport_center-15) - paths[track_i]);
+    track_container[track_i]->setX((viewport_center-15) - paths[track_i]);
   }
 }
 
@@ -548,7 +564,7 @@ void GlSeqBrowser::update_viewport(float center, double new_zoom)
 
 void GlSeqBrowser::update_layout()
 {
-  typedef std::vector<GlSequence>::iterator glseq_itor_type;
+  typedef std::vector<boost::shared_ptr<GlSequence> >::iterator glseq_itor_type;
   float available_height = (float)cur_ortho.top - 2 * (float)border_width;
   float max_base_pairs = 0;
   size_t track_count = track_container.size();
@@ -561,17 +577,17 @@ void GlSeqBrowser::update_layout()
         seq_i != track_container.end();
         ++seq_i, y-=track_spacing)
     {
-      seq_i->setX(0);
-      seq_i->setY(y);
-      if (seq_i->size() > max_base_pairs)
-        max_base_pairs = seq_i->size();
+      (*seq_i)->setX(0);
+      (*seq_i)->setY(y);
+      if ((*seq_i)->size() > max_base_pairs)
+        max_base_pairs = (*seq_i)->size();
     }
   } else if (track_count == 1) {
     // center the single track
     glseq_itor_type seq_i = track_container.begin();
-    seq_i->setX(0);
-    seq_i->setY(viewport_size.x /2);
-    max_base_pairs = seq_i->size();
+    (*seq_i)->setX(0);
+    (*seq_i)->setY(viewport_size.x /2);
+    max_base_pairs = (*seq_i)->size();
   } else {
     // nothing to do as we're empty
     return;
@@ -616,7 +632,7 @@ void GlSeqBrowser::draw_tracks() const
   for(size_t track_i = 0; track_i != track_container.size(); ++track_i)
   {
     glPushName(track_i);
-    track_container[track_i].draw(cur_ortho.left, cur_ortho.right);
+    track_container[track_i]->draw(cur_ortho.left, cur_ortho.right);
     glPopName();
   }
 }
@@ -675,8 +691,8 @@ void GlSeqBrowser::draw_segments() const
       // save the multipart name for our segment
       glPushName(path_index); glPushName(key.first); glPushName(key.second);
       glBegin(GL_LINES);
-      float seq_start_x = track_container[path_index].x();
-      float seq_end_x = track_container[path_index+1].x();
+      float seq_start_x = track_container[path_index]->x();
+      float seq_end_x = track_container[path_index+1]->x();
       glVertex3f(s.start.x + seq_start_x, s.start.y, -1);
       glVertex3f(s.end.x   + seq_end_x  , s.end.y, -1);
       glEnd();
index b5be3a6743d9dbd4af377aef9435e7c0ee0a2673..ba33704bb481f492b116385841889b01c20ffdf8 100644 (file)
@@ -75,8 +75,10 @@ public:
   void push_sequence(boost::shared_ptr<Sequence> s);
   //! add a glsequence to the back of our track container
   void push_sequence(GlSequence s);
+  //! add a glsequence to the back of our track container
+  void push_sequence(boost::shared_ptr<GlSequence> gs);
   //! return our track container
-  const std::vector<GlSequence>& sequences() const;
+  const std::vector<boost::shared_ptr<GlSequence> >& sequences() const;
 
   //! clear all the line segments between all the sequences
   void clear_links();
@@ -96,7 +98,9 @@ public:
   //! copy sequence from selected track using formating function
   template<class Item>
   void copySelectedTracks(std::list<Item>& result, 
-             Item (*format_track)(const Sequence& s, int left, int right));
+             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);
   //! copy sequence from selected tracks as a list of sequences
@@ -193,7 +197,7 @@ private:
   double zoom_level;
   boost::shared_ptr<AnnotationColors> color_mapper;
   //! container of all the GlSequences loaded into our scene
-  std::vector<GlSequence> track_container;
+  std::vector<boost::shared_ptr<GlSequence> > track_container;
   //! counter for each path added to us via connect
   int pathid;
 
index de262d461ce9dc283079842c9da879ac55fd0186..60e14e959772dfd6e06ddbd4ed1a36498ee2f358 100644 (file)
@@ -46,9 +46,9 @@ GlSequence &GlSequence::operator=(const GlSequence & s)
   return *this;
 }
 
-const Sequence& GlSequence::sequence() const
+boost::shared_ptr<Sequence> GlSequence::sequence()
 {
-  return *seq;
+  return seq;
 }
 
 void GlSequence::setX(GLfloat value)
index 31e282e4ef6bad0c096be9bb63e0537edd5f33cc..ab96239374e08f3b9a4263f0e0c622112d152a56 100644 (file)
@@ -30,7 +30,7 @@ public:
    */
   void draw(GLfloat left, GLfloat right) const;
 
-  const Sequence& sequence() const;
+  boost::shared_ptr<Sequence> sequence();
   //! set our starting x (horizontal) coordinate
   void setX(GLfloat);
   //! get our starting x (horizontal) coordinate
index ad183f079e7e0eeed4d54427847099a72fae1037..9e23d28436b32e03dcaf93d3f6f82b6471170620 100644 (file)
@@ -80,11 +80,11 @@ BOOST_AUTO_TEST_CASE( glseqbrowser_center )
   BOOST_CHECK_EQUAL( gt.right(), s0.size() + gt.border()-11 );
 
   // aparently we end up with a different glsequence in the seqbrowser
-  BOOST_CHECK( glseq1.x() != gt.sequences()[1].x() );
+  BOOST_CHECK( glseq1.x() != gt.sequences()[1]->x() );
 
-  BOOST_CHECK_EQUAL( gt.sequences()[0].x(), (gt.viewportCenter()-15)-path[0] );
-  BOOST_CHECK_EQUAL( gt.sequences()[1].x(), (gt.viewportCenter()-15)-path[1] );
-  BOOST_CHECK_EQUAL( gt.sequences()[2].x(), (gt.viewportCenter()-15)-path[2] );
+  BOOST_CHECK_EQUAL( gt.sequences()[0]->x(), (gt.viewportCenter()-15)-path[0] );
+  BOOST_CHECK_EQUAL( gt.sequences()[1]->x(), (gt.viewportCenter()-15)-path[1] );
+  BOOST_CHECK_EQUAL( gt.sequences()[2]->x(), (gt.viewportCenter()-15)-path[2] );
 }
 
 BOOST_AUTO_TEST_CASE( setSelectedPaths )
index b0aa6ad545a8d4ec2ab1a1610e458302a0e6cf8c..f0bf3018bad74d536476cf4f6386c01538d1be59 100644 (file)
@@ -20,15 +20,15 @@ BOOST_AUTO_TEST_CASE ( glsequence_operator_assignment )
   boost::shared_ptr<Sequence> seq1(new Sequence(s1));
 
   GlSequence glseq0(seq0, cm);
-  BOOST_CHECK (glseq0.sequence() == s0);
+  BOOST_CHECK (*glseq0.sequence() == s0);
   GlSequence glseq1(seq1, cm);
   GlSequence glseq_copy0(glseq0);
 
   BOOST_CHECK(glseq_copy0.sequence() == glseq0.sequence());
-  BOOST_CHECK( &(glseq_copy0.sequence()) == &(glseq0.sequence()));
+  BOOST_CHECK( glseq_copy0.sequence() == glseq0.sequence());
 
   glseq0 = glseq1;
-  BOOST_CHECK( glseq0.sequence() == s1 );
+  BOOST_CHECK( *glseq0.sequence() == s1 );
 }
 
 BOOST_AUTO_TEST_CASE( glsequence_color )
index ea456ebf39aeb9284177cf6075a319e39761d542..c90149496efe39e4d920a03f313a407c72a616db 100644 (file)
@@ -15,8 +15,7 @@ void export_glsequence()
       >())
     .def(init<GlSequence &>())
     .def("draw", &GlSequence::draw)
-    .def("sequence", &GlSequence::sequence, 
-                  return_internal_reference<>())
+    .def("sequence", &GlSequence::sequence )
     .add_property("x", &GlSequence::x, &GlSequence::setX)
     .add_property("y", &GlSequence::y, &GlSequence::setY)
     .add_property("size", &GlSequence::size)
index 1587e47407b92b7c8747120bc85f8e340c26343c..6759567ef468b64a7b6d05bf4099ab07b69ee800 100644 (file)
@@ -92,34 +92,6 @@ MussaWindow::MussaWindow(Mussa *analysis_, QWidget *parent) :
   updateAnalysis();
 }
 
-MussaWindow::~MussaWindow()
-{
-  if (analysis != 0) delete analysis;
-  aligned_windows.clear();
-  if (motif_editor != 0) delete motif_editor;
-  if (progress_dialog != 0) delete progress_dialog;
-
-  if (aboutAction != 0) delete aboutAction;
-  if (closeAction != 0) delete closeAction;
-  if (createNewAnalysisAction != 0) delete createNewAnalysisAction;
-  if (createSubAnalysisAction != 0) delete createSubAnalysisAction;
-  if (editMotifsAction != 0) delete editMotifsAction;
-  if (loadMotifListAction != 0) delete loadMotifListAction;
-  if (loadMupaAction != 0) delete loadMupaAction;
-  if (loadSavedAnalysisAction != 0) delete loadSavedAnalysisAction;
-  if (mussaManualAssistantAction != 0) delete mussaManualAssistantAction;
-  if (newMussaWindowAction != 0) delete newMussaWindowAction;
-  if (saveBrowserPixmapAction != 0) delete saveBrowserPixmapAction;
-  if (saveMotifListAction != 0) delete saveMotifListAction;
-  if (showMussaViewToolbarAction != 0) delete showMussaViewToolbarAction;
-  if (toggleMotifsAction != 0) delete toggleMotifsAction;
-  if (whatsThisAction != 0) delete whatsThisAction;
-  if (viewMussaAlignmentAction != 0) delete viewMussaAlignmentAction;
-  
-  if (manualAssistant != 0) delete manualAssistant;
-  
-}
-
 void MussaWindow::setAnalysis(Mussa *new_analysis)
 {
   if (new_analysis != 0) {
index 0e15a55e78d2855c2efb7fbfc6b650428cf70ad0..30900c83b9ee019697d3156ebec5321826a06c3f 100644 (file)
@@ -31,7 +31,6 @@ class MussaWindow : public QMainWindow
 
 public: 
   MussaWindow(Mussa* analysis=0, QWidget *parent=0);
-  ~MussaWindow();
 
   //! reset any attached window
   void clear();
index 5ac41ac8c8fd92024aaa319db19b79534bec994c..5fdafcdb80a73824dd51693ed0429cea5c833d4e 100644 (file)
@@ -86,6 +86,8 @@ void SubanalysisWindow::run()
       itor != model.end();
       ++itor)
   {
+    // append_sequence from a const Sequence & will make a copy 
+    // for the shared pointer.
     m->append_sequence(itor->getSelectedSequence());
   }
 
index 116d58c7df43cb89501220b8ebc37e9b6727f829..3d31f7f748bbb0bfaa29f95f40cdf53f1e38e639 100644 (file)
@@ -108,13 +108,13 @@ void SequenceBrowser::displayContextMenu(const QPoint& point)
   popupMenu.popup(point);
 }
 
-void SequenceBrowser::push_sequence(const Sequence &s)
+void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
 {
   GlSeqBrowser::push_sequence(s);
   emit tracksChanged();
 }
 
-void SequenceBrowser::push_sequence(GlSequence &gs)
+void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
 {
   GlSeqBrowser::push_sequence(gs);
   emit tracksChanged();
index 43e817c0899c3e02a62d87a95f6762cdb00e545a..7ada6124d2cab26c56e2c84a0fe60f9ff41c8076 100644 (file)
@@ -10,6 +10,8 @@
 #include <vector>
 #include <set>
 
+#include <boost/shared_ptr.hpp>
+
 #include "alg/mussa.hpp"
 #include "alg/glsequence.hpp"
 #include "alg/glseqbrowser.hpp"
@@ -28,8 +30,8 @@ public:
 
   QSize sizeHint() const;
   void clear();
-  void push_sequence(const Sequence &s);
-  void push_sequence(GlSequence &);
+  void push_sequence(boost::shared_ptr<Sequence> s);
+  void push_sequence(boost::shared_ptr<GlSequence>);
 
   //! return the popup menu for the glcanvas (reference stored internally)
   QMenu &getPopupMenu();
index f63a5001481e22dcbf8a55999335d8d8d852e7f8..b695f24c5fd19a11c435ea44bfe62d336c6ff528 100644 (file)
@@ -20,16 +20,18 @@ void SequenceBrowserSidebar::clear()
   descriptions.clear();
 }
 
-void SequenceBrowserSidebar::setSequences(vector<GlSequence>& sequences)
+void SequenceBrowserSidebar::setSequences(
+  vector<boost::shared_ptr<GlSequence> > sequences
+)
 {
+  typedef vector<boost::shared_ptr<GlSequence> > vector_shared_glsequences;
   clear();
-  for (vector<GlSequence>::const_iterator track_i = sequences.begin();
+  for (vector_shared_glsequences::iterator track_i = sequences.begin();
        track_i != sequences.end();
        ++track_i)
   {
     SequenceDescription *desc = new SequenceDescription(this);
-    desc->setName(track_i->sequence().get_species());
-    desc->setLength(track_i->sequence().length());
+    desc->setGlSequence(*track_i);
     descriptions.push_back(desc);
     layout.addWidget(desc);
     if ((track_i+1) != sequences.end()) {
@@ -38,3 +40,4 @@ void SequenceBrowserSidebar::setSequences(vector<GlSequence>& sequences)
   }
   setLayout(&layout);
 }
+
index 48bc78eb93da839af8f4cae6e4c6954e64022e8f..4c599dedd6e4ce886d77cdbd3da064b62ecbd327 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <vector>
 
+#include <boost/shared_ptr.hpp>
+
 #include <QVBoxLayout>
 #include <QWidget>
 #include "qui/seqbrowser/SequenceBrowser.hpp"
@@ -21,7 +23,7 @@ public:
 
   //! clear our list of descriptions
   void clear();
-  void setSequences(std::vector<GlSequence>& );
+  void setSequences(std::vector<boost::shared_ptr<GlSequence> > );
 
   std::vector<SequenceDescription *> descriptions;
 public slots:
index 0f396f2f27126eebe48eb6778e273e76dba75572..ef3db3309334530d1b1b43e9e60238c58f7f46bd 100644 (file)
@@ -65,7 +65,7 @@ void SequenceBrowserWidget::copySelectedTracksAsSeqLocation(
 }
 
 void SequenceBrowserWidget::setSequences(
-    const std::vector< boost::shared_ptr<Sequence> >& sequences,
+    const std::vector<boost::shared_ptr<Sequence> >& sequences,
     boost::shared_ptr<AnnotationColors> cm)
 {
   SequenceBrowser& browser = scrollable_browser.browser();
@@ -75,19 +75,33 @@ void SequenceBrowserWidget::setSequences(
       ++seq_i)
   {
     boost::shared_ptr<GlSequence> gs(new GlSequence(*seq_i, cm));
-    converted_sequences.push_back(*gs);
-    browser.push_sequence(*gs);
+    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
+  vector<SequenceDescription *> left = left_sidebar.descriptions;
+  vector<SequenceDescription *> right = right_sidebar.descriptions;
+  for(size_t i = 0; i != 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 &)));
+  }
+
   updatePosition();
 }
 
-void SequenceBrowserWidget::setSequences(std::vector<GlSequence>& sequences)
+void SequenceBrowserWidget::setSequences(
+  std::vector<boost::shared_ptr<GlSequence> >& sequences
+)
 {
   SequenceBrowser& browser = scrollable_browser.browser();
   clear();
-  for(vector<GlSequence>::iterator seq_i = sequences.begin();
+  for(vector<boost::shared_ptr<GlSequence> >::iterator seq_i = sequences.begin();
       seq_i != sequences.end();
       ++seq_i)
   {
@@ -98,7 +112,7 @@ void SequenceBrowserWidget::setSequences(std::vector<GlSequence>& sequences)
   updatePosition();
 }
 
-const vector<GlSequence>& SequenceBrowserWidget::sequences() const
+const vector<boost::shared_ptr<GlSequence> >& SequenceBrowserWidget::sequences() const
 {
   return scrollable_browser.browser().sequences();
 }
@@ -140,13 +154,13 @@ void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
 void SequenceBrowserWidget::updatePosition()
 {
   const SequenceBrowser& browser = scrollable_browser.browser();
-  const vector<GlSequence> &sequences = browser.sequences();
+  const vector<boost::shared_ptr<GlSequence> > &sequences = browser.sequences();
   vector<SequenceDescription *> left = left_sidebar.descriptions;
   vector<SequenceDescription *> 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.browser().update();
   scrollable_browser.updateScrollBar();
index 6c82f58b862d554a515a804ec8beb4aaaa3dc6f7..332fa1bf0f4c05d6c9268dfde508e9c76d4ca9c5 100644 (file)
@@ -42,8 +42,8 @@ public:
   void setSequences(
       const std::vector< boost::shared_ptr<Sequence> >& sequences, 
       boost::shared_ptr<AnnotationColors> cm);
-  void setSequences(std::vector<GlSequence>& sequences);
-  const std::vector<GlSequence>& sequences() const;
+  void setSequences(std::vector<boost::shared_ptr<GlSequence> >& sequences);
+  const std::vector<boost::shared_ptr<GlSequence> >& sequences() const;
 
   //! reset just the links we're displaying
   void clear_links();
@@ -78,6 +78,6 @@ private:
   //! sequences created by a setSequences(vector<Sequences>) call
   /*! I need to save them so i can free them to avoid a memory leak 
    */
-  std::vector<GlSequence> converted_sequences;
+  std::vector<boost::shared_ptr<GlSequence> > converted_sequences;
 };
 #endif
index d01ae5f7ab8d4a1f7313b7165a1215f07cf58af8..80dfa8f8a93ad683fc557811f100c1b598c3774f 100644 (file)
@@ -1,5 +1,4 @@
 #include <QVBoxLayout>
-
 #include "qui/seqbrowser/SequenceDescription.hpp"
 
 using namespace std;
@@ -12,15 +11,12 @@ SequenceDescription::SequenceDescription(QWidget *parent)
   createWidget();
 }
 
-SequenceDescription::SequenceDescription(string name, int length, 
-                                         QWidget *parent)
-  : QFrame(parent),
-    pos(-1) // set pos to an invalid value so the setPos function will call
-            // setText
+SequenceDescription::SequenceDescription(
+    boost::shared_ptr<GlSequence> glseq,
+    QWidget *parent
+) : QFrame(parent) 
 {
-  setName(name);
-  setLength(length);
-  createWidget();
+  setGlSequence(glseq);  
 }
 
 void SequenceDescription::createWidget()
@@ -31,38 +27,84 @@ void SequenceDescription::createWidget()
   layout->addWidget(&name_label);
   layout->addWidget(&length_label);
   layout->addWidget(&position_label);
+  name_label.setMaximumWidth(length_label.fontMetrics().width("01234567"));
   setLayout(layout);
+
+  connect(&name_label, SIGNAL(textChanged(const QString& )),
+          this, SLOT(setName(const QString& )));
+}
+
+void SequenceDescription::setGlSequence(
+  boost::shared_ptr<GlSequence> glseq  )
+{
+  if (glseq != glsequence_) {
+    glsequence_ = glseq;
+    setName(glsequence_->sequence()->get_species());
+    setLength(glsequence_->sequence()->length());
+    emit glsequenceChanged(glsequence_);
+  }
+}
+
+boost::shared_ptr<GlSequence> SequenceDescription::glsequence() 
+{
+  return glsequence_;
 }
 
 void SequenceDescription::setName(std::string name)
 {
-  if (name != name_label.text().toStdString()) {
-    name_label.setText(name.c_str());
-    emit nameChanged(name);
+  setName(QString(name.c_str()));
+}
+
+void SequenceDescription::setName(const QString& name_)
+{
+  std::string std_name_ = name_.toStdString();
+
+  if (std_name_ != glsequence_->sequence()->get_species()) {
+    glsequence_->sequence()->set_species(std_name_);
+    emit nameChanged(name_);
+  }
+
+    // no need to setText again if its because of user editing
+  if (name_ != name_label.text()) {
+    name_label.setText(name_);
   }
 }
 
-void SequenceDescription::setLength(int length_)
+std::string SequenceDescription::name() const 
+{ 
+  if (glsequence_) 
+    return glsequence_->sequence()->get_species();
+  else
+    return string("");
+}
+
+void SequenceDescription::setLength(int length)
 {
   QString s;
-  float short_length = length_;
-  if (length_ != length) {
-    if (short_length > 1000000) {
-      short_length /= 1000000;
-      s.setNum(short_length, 'f', 2);
-      s += "mb";
-    } if (short_length > 1000) {
-      short_length /= 1000;
-      s.setNum(short_length, 'f', 2);
-      s += "kb";
-    } else {
-      s.setNum(short_length);
-      s += "b";
-    }
-    length_label.setText(s);
-    length = length_;
-    emit lengthChanged(length);
+  float short_length = length;
+  if (short_length > 1000000) {
+    short_length /= 1000000;
+    s.setNum(short_length, 'f', 2);
+    s += "mb";
+  } if (short_length > 1000) {
+    short_length /= 1000;
+    s.setNum(short_length, 'f', 2);
+    s += "kb";
+  } else {
+    s.setNum(short_length);
+    s += "b";
   }
+  length_label.setText(s);
+}
+
+int SequenceDescription::length() const 
+{
+  return 0;
+
+  if (glsequence_)
+    return glsequence_->sequence()->size();
+  else
+    return 0;
 }
 
 void SequenceDescription::setPosition(int pos_) 
@@ -74,3 +116,8 @@ void SequenceDescription::setPosition(int pos_)
     emit positionChanged(pos);
   }
 }
+
+int SequenceDescription::position() const
+{
+  return pos;
+}
index ff449ee1240c931552e0a989433133735b954ca0..929a999ccff3a9b9e21dfa8061936b46962b5510 100644 (file)
@@ -1,38 +1,53 @@
 #ifndef _SEQUENCE_DESCRIPTION_H
 #define _SEQUENCE_DESCRIPTION_H
 
+#include <boost/shared_ptr.hpp>
+
 #include <string>
 
 #include <QString>
 #include <QLabel>
+#include <QLineEdit>
 #include <QFrame>
 
+#include "alg/glsequence.hpp"
+
 class SequenceDescription : public QFrame
 {
   Q_OBJECT 
 
 public:
   SequenceDescription(QWidget *parent=0);
-  SequenceDescription(std::string name, int length, QWidget *parent=0);
+  SequenceDescription(boost::shared_ptr<GlSequence>, QWidget *);
+  void setName(std::string name);
+
+  boost::shared_ptr<GlSequence> glsequence();
+  std::string name() const; 
+  int length() const;
+  int position() const;
 
 public slots:
-  void setName(std::string name);
-  void setLength(int length);
+  //! Display the passed GlSequence information
+  void setGlSequence(boost::shared_ptr<GlSequence>);
+  //! set the name for our sequence
+  void setName(const QString& name);
   void setPosition(int pos);
 
 signals:
-  void nameChanged(std::string name);
-  void lengthChanged(float length);
+  void glsequenceChanged(boost::shared_ptr<GlSequence>);
+  void nameChanged(const QString& name);
   void positionChanged(int pos);
 
 private:
-  QLabel name_label;
+  QLineEdit name_label;
   QLabel length_label;
   QLabel position_label;
 
-  int length;
+  boost::shared_ptr<GlSequence> glsequence_;
   int pos;
 
   void createWidget();
+  //! format the length and set the QLabel
+  void setLength(int length);
 };
 #endif
index feff58e226b947251291e1a194c1a4cb30cb5032..7e279f2647b14a271722c9cbdd9e96972f22e69f 100644 (file)
@@ -40,4 +40,5 @@ ENDMACRO(MAKE_UNITTEST)
 
 MAKE_UNITTEST(TestSequenceLocationModel)
 MAKE_UNITTEST(TestSequenceBrowser)
+MAKE_UNITTEST(TestSequenceDescription)
 MAKE_UNITTEST(TestColorSharing)
index 69256153866f783a781e7f49d3bc5715816100ce..eb09d6abb27e5f7d8bb3560d1cbae5d5458ec536 100644 (file)
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include <boost/assign.hpp>
+#include <boost/shared_ptr.hpp>
 using namespace boost::assign;
 
 
@@ -19,8 +20,8 @@ class TestSequenceBrowser : public QObject
 private slots:
 
   void testSimplePushSequence() {
-    Sequence seq1("AAGGCCTT");
-    Sequence seq2("GGCCTTAA");
+    boost::shared_ptr<Sequence> seq1(new Sequence("AAGGCCTT"));
+    boost::shared_ptr<Sequence> seq2(new Sequence("GGCCTTAA"));
 
     SequenceBrowser browser;
     QVERIFY(browser.sequences().size() == 0);
@@ -32,8 +33,8 @@ private slots:
   }
 
   void testSelect() {
-    Sequence seq1("AAGGCCTT");
-    Sequence seq2("GGCCTTAA");
+    boost::shared_ptr<Sequence> seq1(new Sequence("AAGGCCTT"));
+    boost::shared_ptr<Sequence> seq2(new Sequence("GGCCTTAA"));
 
     SequenceBrowser browser;
     browser.push_sequence(seq1);
diff --git a/qui/test/TestSequenceDescription.cpp b/qui/test/TestSequenceDescription.cpp
new file mode 100644 (file)
index 0000000..81be6dc
--- /dev/null
@@ -0,0 +1,49 @@
+#include <QtGui>
+#include <QtTest/QtTest>
+
+#include "alg/sequence.hpp"
+#include "alg/glsequence.hpp"
+#include "alg/annotation_colors.hpp"
+#include "qui/seqbrowser/SequenceDescription.hpp"
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+class TestSequenceDescription : public QObject
+{
+  Q_OBJECT
+
+private slots:
+  void testSimple() {
+    boost::shared_ptr<Sequence> seq1(new Sequence("AAGGCCTT"));
+    seq1->set_species("foo");
+    boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
+    boost::shared_ptr<GlSequence> glseq1(new GlSequence(seq1, cm));
+
+    SequenceDescription sd(glseq1, 0);
+    QVERIFY(sd.glsequence() == glseq1);
+    QVERIFY(sd.glsequence()->sequence()->get_species() == seq1->get_species());
+    sd.setName(std::string("bar"));
+    QVERIFY(sd.glsequence()->sequence()->get_species() == seq1->get_species());
+    QVERIFY(seq1->get_species() == "bar");
+  }
+  void testDeletedPointer() {
+    SequenceDescription sd;
+
+    { 
+      boost::shared_ptr<Sequence> seq1(new Sequence("AAGGCCTT"));
+      Sequence m("AAGG");
+      seq1->find_motif(m);
+      seq1->set_species("foo");
+      boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
+      boost::shared_ptr<GlSequence> glseq1(new GlSequence(seq1, cm));
+      sd.setGlSequence(glseq1);
+    }
+
+    QVERIFY(sd.name() == "foo");
+  }
+};
+
+QTEST_MAIN(TestSequenceDescription)
+#include "moc_TestSequenceDescription.cxx"