do a better job of erasing the browser sidebars
authorDiane Trout <diane@caltech.edu>
Thu, 14 Sep 2006 21:07:59 +0000 (21:07 +0000)
committerDiane Trout <diane@caltech.edu>
Thu, 14 Sep 2006 21:07:59 +0000 (21:07 +0000)
ticket:127
the previous sidebar clearing code didn't remove the spacers between
the various widgets. This will do that (though for some reason
QLayout::removeItem wouldn't properly destroy my widgets, I had to use
QLayout;:removeWidget on them, which is why there are two loops in
SequenceBrowserSidebar::clear.

I also defined some typedefs in SequenceBrowserSidebar to abstract out
the exact type being used to store the sidebar detail widgets
(SequenceDescription) in case I want to switch to a boost::shared_ptr in case I want to switch to a boost::shared_ptr in case I want to switch to a boost::shared_ptr in case I want to switch to a boost::shared_ptr

qui/seqbrowser/SequenceBrowserSidebar.cpp
qui/seqbrowser/SequenceBrowserSidebar.hpp
qui/seqbrowser/SequenceBrowserWidget.cpp

index b695f24c5fd19a11c435ea44bfe62d336c6ff528..fa527b01f8d1c1401770af23b33d48544415346d 100644 (file)
@@ -10,16 +10,28 @@ SequenceBrowserSidebar::SequenceBrowserSidebar(QWidget* parent)
 
 void SequenceBrowserSidebar::clear()
 {
-  for (vector<SequenceDescription *>::iterator desc_i = descriptions.begin();
+  // remove our widgets
+  for (SequenceBrowserSidebar::iterator desc_i = descriptions.begin();
        desc_i != descriptions.end();
        ++desc_i)
   {
     layout.removeWidget(*desc_i);
     delete *desc_i;
   }
+  // remove any crud that's left over (like spacers)
+  QLayoutItem *child;
+  while ((child = layout.takeAt(0)) != 0) {
+    layout.removeItem(child);
+    delete child;
+  }
   descriptions.clear();
 }
 
+SequenceBrowserSidebar::size_type SequenceBrowserSidebar::size() const
+{
+  return descriptions.size();
+}
+
 void SequenceBrowserSidebar::setSequences(
   vector<boost::shared_ptr<GlSequence> > sequences
 )
@@ -30,7 +42,7 @@ void SequenceBrowserSidebar::setSequences(
        track_i != sequences.end();
        ++track_i)
   {
-    SequenceDescription *desc = new SequenceDescription(this);
+    seq_description_type desc = new SequenceDescription(this);
     desc->setGlSequence(*track_i);
     descriptions.push_back(desc);
     layout.addWidget(desc);
index 4c599dedd6e4ce886d77cdbd3da064b62ecbd327..09cbe3a950076d461df4d9aca4806636592ef3f8 100644 (file)
@@ -17,15 +17,24 @@ class SequenceBrowserSidebar : public QWidget
   Q_OBJECT
 
 public:
+  //! pointer to our sequence description widget
+  typedef SequenceDescription *seq_description_type;
+  //! an STL collection of our sequence description widget
+  typedef std::vector<seq_description_type> collection;
+  typedef collection::size_type size_type;
+  typedef collection::iterator iterator;
   enum SidebarSide { Left, Right };
 
   SequenceBrowserSidebar(QWidget *parent = 0);
 
   //! clear our list of descriptions
   void clear();
+  //! how many items are we storing
+  size_t size() const;
+  //! set the glsequences we're going to be displaying
   void setSequences(std::vector<boost::shared_ptr<GlSequence> > );
 
-  std::vector<SequenceDescription *> descriptions;
+  collection descriptions;
 public slots:
   //! update the reported sequence position for each of our sequences
   /*! for example when the right side is at position 3000 call 
index ef3db3309334530d1b1b43e9e60238c58f7f46bd..615291347b8872942b47455ffde77d76476859c5 100644 (file)
@@ -37,6 +37,16 @@ void SequenceBrowserWidget::clear()
 {
   converted_sequences.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();
 }
@@ -82,8 +92,8 @@ void SequenceBrowserWidget::setSequences(
   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;
+  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)
   {
     connect(left[i], SIGNAL(nameChanged(const QString &)),
@@ -155,8 +165,8 @@ void SequenceBrowserWidget::updatePosition()
 {
   const SequenceBrowser& browser = scrollable_browser.browser();
   const vector<boost::shared_ptr<GlSequence> > &sequences = browser.sequences();
-  vector<SequenceDescription *> left = left_sidebar.descriptions;
-  vector<SequenceDescription *> 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()));