From: Diane Trout Date: Thu, 14 Sep 2006 21:07:59 +0000 (+0000) Subject: do a better job of erasing the browser sidebars X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=mussa.git;a=commitdiff_plain;h=d401c1bf5e4a8ff711670bcba672d79acaac8677 do a better job of erasing the browser sidebars 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 --- diff --git a/qui/seqbrowser/SequenceBrowserSidebar.cpp b/qui/seqbrowser/SequenceBrowserSidebar.cpp index b695f24..fa527b0 100644 --- a/qui/seqbrowser/SequenceBrowserSidebar.cpp +++ b/qui/seqbrowser/SequenceBrowserSidebar.cpp @@ -10,16 +10,28 @@ SequenceBrowserSidebar::SequenceBrowserSidebar(QWidget* parent) void SequenceBrowserSidebar::clear() { - for (vector::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 > 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); diff --git a/qui/seqbrowser/SequenceBrowserSidebar.hpp b/qui/seqbrowser/SequenceBrowserSidebar.hpp index 4c599de..09cbe3a 100644 --- a/qui/seqbrowser/SequenceBrowserSidebar.hpp +++ b/qui/seqbrowser/SequenceBrowserSidebar.hpp @@ -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 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 > ); - std::vector 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 diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index ef3db33..6152913 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -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 left = left_sidebar.descriptions; - vector 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 > &sequences = browser.sequences(); - vector left = left_sidebar.descriptions; - vector 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()));